In this notebook we analyze the first “think/believe” task, in which participants completed a series of fill-in-the-blanks by choosing between two options: “think” and “believe.”

NAs introduced by coercion

Overview

From the preregistration (link):

“Our overarching hypothesis for the present study is that […] other languages will have an epistemic verb that is more likely to be used for religious attitude reports (similar to English “believe”) and a different epistemic verb that is more likely to be used for matter-of-fact attitude reports (similar to English “think”).

For this study, we are examining five languages in five regions of interest: (i) Mandarin in China; (ii) Thai in Thailand; (iii) Bislama (an English-based creole language) on the Melanesian Island of Vanuatu; (iv) Fante in Ghana; and (v) American English in the Bay Area, California.

We thus have five more specific sub-hypotheses. For each of the first four languages / regions of interest, we hypothesize that a set of words or phrases exists whose usage parallels the difference between usage of “think” and “believe” in American English, with one word or phrase (the “think” analogue) being used for more matter-of-fact attitude reports and the other (the “believe” analogue) being more likely to be used for religious attitude reports. That gives us our first four sub-hypotheses: that Mandarin, Thai, Bislama and Fante speakers will each use two different words in a manner parallel to the use of “think” and “believe” in an American English setting as identified by Heiphetz, Landers, and Van Leeuwen. Our fifth sub-hypothesis is that the Bay Area portion of the study will replicate the results of the earlier study of Heiphetz, Landers, and Van Leeuwen."

KW EXECUTIVE SUMMARY (2020-01-19): We replicated the original finding in the US: participants were more likely to circle “believe” for religious than fact questions. We found the same pattern in all five countries/langauges included in this study.

The pattern was somewhat weaker in Ghana/Fante than in other countries/language (though it was still significant), and the pattern was somewhat stronger in Thailand/Thai than in other countries/languages.

Samples

Before we begin, it’s important to note that we had unequal sample sizes by country:

However, 29 participants completed this task after completing other surveys, and an additional 4 failed the attention check. In the following analyses I will exclude these participants, leaving us with the following samples:

Plots

We’ll begin by plotting responses of “think” (red) vs. “believe” (turquoise) to get an overall sense of any patterns in the data.

By superordinate category

By category

By question

Analysis: KW without looking at preregistration

Here’s how I analyzed the data before looking at the preregistration. I think these analyses are valuable because they’re a little more efficient than the preregistered analyses – no need for follow-up tests – and they directly test the question of whether the effect of interest varies across countries/langauges.

Technical note: Unless specified otherwise, all of these analyses use “effect coding” for categorical variables (e.g., country, category of question) – meaning that each country/langauge is compared to the “grand mean” collapsing across all countries/languages. Because of degrees of freedom issues, each analysis only compares 4 of the 5 countries to the grand mean – by default, I’ve left out the comparison of the US/English to the grand mean, but stats for that comparison could easily be calculated (if we left out another country/language instead). This is just to say that you won’t see statements like “The effect was exaggerated in the US relative to other countries,” although they might be true.

KW Analysis #1

First, I used a mixed effects logistic regression predicting how likely a participant was to circle “believe” based on the superordinate category of the question (“religious” questions or “fact” questions), the country they were in/language they were using (US/English, Ghana/Fante, Thailand/Thai, China/Mandarin, or Vanuatu/Bislama), and an interaction between them, with a maximal random effects structure (random interpcepts and slopes by subject, and random intercepts by question). This analysis gives me a sense of (1) Whether participants were more likely to circle “believe” for religious questions than fact questions, and whether this tendency varied by country/language, controlling for the fact that the overall rates of circling “believe” might vary by country/language (and accounting for individual differences and differences across individual questions).

r1.1 <- lmer(believe ~ super_cat * country 
             + (1 + super_cat | thb1_subj) + (1 | question),
             data = d1_long)
Parameter β β' β'' Std. Err. df t p
Intercept 0.60 - - 0.03 24.00 23.59 <0.001 ***
Category (religious) 0.20 0.39 0.39 0.03 26.58 7.61 <0.001 ***
Country (Gh.) 0.09 0.10 0.10 0.01 338.99 6.71 <0.001 ***
Country (Th.) -0.03 -0.04 -0.04 0.01 338.99 -2.44 0.015 *
Country (Ch.) -0.03 -0.03 -0.03 0.01 338.99 -2.14 0.033 *
Country (Vt.) -0.01 -0.02 -0.02 0.01 338.99 -1.23 0.221
Category (religious) × Country (Gh.) -0.10 -0.13 -0.13 0.02 339.01 -5.67 <0.001 ***
Category (religious) × Country (Th.) 0.07 0.09 0.09 0.02 339.01 4.27 <0.001 ***
Category (religious) × Country (Ch.) -0.01 -0.01 -0.01 0.02 339.01 -0.55 0.585
Category (religious) × Country (Vt.) 0.00 0.01 0.01 0.01 339.01 0.33 0.744

The effects of primary interest are in bold:

  • Category (religious): Collapsing across countries/languages, participants were indeed more likely to say “believe” for “religious” questions. This effect is much larger than any of the differences across countries/languages (as you can see by comparing the β values for different effects).
  • Country (Gh.): Participants in Ghana were generally more likely than other participants to say “believe,” collapsing across question categories.
  • Country (Th.): Participants in Thailand were generally less likely than other participants to say “believe,” collapsing across question categories.
  • Country (Ch.): Participants in China were no more or less likely than other participants to say “believe,” collapsing across question categories.
  • Country (Vt.): Participants in Vanuatu were no more or less likely than other participants to say “believe,” collapsing across question categories.
  • Category (religious) x Country (Gh.): The difference in rates of “believe” responses between question categories was smaller in Ghana than in other countries.
  • Category (religious) x Country (Th.): The difference in rates of “believe” responses between question categories was larger in Thailand than in other countries.
  • Category (religious) x Country (Ch.): The difference in rates of “believe” responses between question categories was no smaller or larger in China than in other countries.
  • Category (religious) x Country (Vt.): The difference in rates of “believe” responses between question categories was no smaller or larger in Vanuatu than in other countries.

Take-away: The predicted effect is evident in this dataset. It appears to be exaggerated in Thailand and diminished in Ghana.

KW Analyses #1a-1e (by country)

Next, I did this same analysis within each country/langauge alone (using the most maximal random effect structure that converged across all countries/languages).

# note: using most maximal common random effects structure
r1.1_us <- lmer(believe ~ super_cat + 
                  # (1 + super_cat | thb1_subj) + (1 | question), 
                  # (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
                  (1 | thb1_subj) + (1 | question),
                # (1 + super_cat | thb1_subj),
                data = d1_long %>% filter(country == "US"))

r1.1_gh <- lmer(believe ~ super_cat + 
                  # (1 + super_cat | thb1_subj) + (1 | question),
                  # (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
                  (1 | thb1_subj) + (1 | question),
                # (1 + super_cat | thb1_subj),
                data = d1_long %>% filter(country == "Ghana"))

r1.1_th <- lmer(believe ~ super_cat + 
                  # (1 + super_cat | thb1_subj) + (1 | question), 
                  # (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
                  (1 | thb1_subj) + (1 | question),
                # (1 + super_cat | thb1_subj),
                data = d1_long %>% filter(country == "Thailand"))

r1.1_ch <- lmer(believe ~ super_cat + 
                  # (1 + super_cat | thb1_subj) + (1 | question), 
                  # (1 + super_cat || thb1_subj) + (1 | question), # failed to converge
                  (1 | thb1_subj) + (1 | question),
                # (1 + super_cat | thb1_subj),
                data = d1_long %>% filter(country == "China"))

r1.1_vt <- lmer(believe ~ super_cat + 
                  # (1 + super_cat | thb1_subj) + (1 | question), # failed to converge
                  # (1 + super_cat || thb1_subj) + (1 | question),
                  (1 | thb1_subj) + (1 | question),
                # (1 + super_cat | thb1_subj),
                data = d1_long %>% filter(country == "Vanuatu"))
Country Parameter β Std. Err. df t p
US Intercept 0.58 0.02 26.45 26.45 <0.001 ***
Category (religious) 0.24 0.02 23.00 11.51 <0.001 ***
Ghana Intercept 0.69 0.04 30.42 18.86 <0.001 ***
Category (religious) 0.09 0.03 23.00 2.80 0.010 *
Thailand Intercept 0.57 0.03 29.64 20.37 <0.001 ***
Category (religious) 0.27 0.03 23.00 10.08 <0.001 ***
China Intercept 0.57 0.03 31.80 22.90 <0.001 ***
Category (religious) 0.19 0.02 23.00 8.55 <0.001 ***
Vanuatu Intercept 0.59 0.04 23.38 14.26 <0.001 ***
Category (religious) 0.20 0.04 23.00 4.95 <0.001 ***

The effects of primary interest are in bold, and the take-away is clear: In every country/language, participants were more likely to say “believe” in “religious” questions than in “fact” questions.

KW Analysis #2

In this analysis, I treated country/language as a random rather than fixed effect (with participants nested within countries). (Note that I had to use a simpler random effects structure in order to get the model to converge.)

r1.2 <- lmer(believe ~ super_cat 
             # + (1 + super_cat | country/thb1_subj) + (1 | question), # failed to converge
             # + (1 + super_cat || country/thb1_subj) + (1 | question), # failed to converge
             # + (1 + super_cat | country/thb1_subj), # failed to converge
             + (1 | country/thb1_subj) + (1 | question),
             data = d1_long)
Parameter β Std. Err. df t p
Intercept 0.60 0.04 11.69 16.43 <0.001 ***
Category (religious) 0.21 0.03 23.00 8.26 <0.001 ***

The effect still holds.

KW Analysis #3

Finally, I ran a version of this first model looking at 5 categories of questions (rather than 2 superordinate categories): Christian religious, Buddhist religious, well-known fact, esoteric fact, and personal fact. I compared these categories using planned orthogonal contrasts.

r1.3 <- lmer(believe ~ category * country 
             # + (1 + category | thb1_subj) + (1 | question), # failed to converge
             + (1 + category || thb1_subj) + (1 | question),
             # + (1 + category | thb1_subj), 
             # + (1 + category || thb1_subj), 
             # + (1 | thb1_subj) + (1 | question),
             data = d1_long)
Parameter β Std. Err. df t p
Intercept
Intercept 0.56 0.02 23.31 34.07 <0.001 ***
Category comparisons
Category (Religious vs. fact) 0.08 0.01 28.13 11.27 <0.001 ***
Category (Christian vs. Buddhist religious) 0.06 0.03 20.55 2.44 0.024 *
Category (well-known & esoteric vs. personal fact) 0.06 0.01 21.75 3.90 <0.001 ***
Category (well-known vs. esoteric fact) 0.07 0.03 22.30 2.67 0.014 *
Country comparisons
Country (Gh.) 0.11 0.01 348.32 7.83 <0.001 ***
Country (Th.) -0.04 0.01 348.32 -3.44 <0.001 ***
Country (Ch.) -0.03 0.01 348.32 -1.87 0.062
Country (Vt.) -0.01 0.01 348.32 -1.24 0.215
Interactions: Ghana
Category (Religious vs. fact) × Country (Gh.) -0.04 0.01 339.31 -5.66 <0.001 ***
Category (Christian vs. Buddhist religious) × Country (Gh.) 0.05 0.02 992.01 2.85 0.004 **
Category (well-known & esoteric vs. personal fact) × Country (Gh.) -0.03 0.01 341.34 -2.66 0.008 **
Category (well-known vs. esoteric fact) × Country (Gh.) 0.02 0.02 340.19 1.24 0.214
Interactions: Thailand
Category (Religious vs. fact) × Country (Th.) 0.03 0.01 339.31 4.26 <0.001 ***
Category (Christian vs. Buddhist religious) × Country (Th.) -0.05 0.01 992.01 -3.86 <0.001 ***
Category (well-known & esoteric vs. personal fact) × Country (Th.) 0.02 0.01 341.34 2.26 0.024 *
Category (well-known vs. esoteric fact) × Country (Th.) -0.02 0.02 340.19 -1.15 0.252
Interactions: China
Category (Religious vs. fact) × Country (Ch.) 0.00 0.01 339.31 -0.55 0.585
Category (Christian vs. Buddhist religious) × Country (Ch.) -0.04 0.02 992.01 -2.48 0.013 *
Category (well-known & esoteric vs. personal fact) × Country (Ch.) -0.04 0.01 341.34 -3.29 0.001 **
Category (well-known vs. esoteric fact) × Country (Ch.) -0.05 0.02 340.19 -2.49 0.013 *
Interactions: Vanuatu
Category (Religious vs. fact) × Country (Vt.) 0.00 0.01 339.31 0.33 0.745
Category (Christian vs. Buddhist religious) × Country (Vt.) 0.06 0.01 992.01 4.66 <0.001 ***
Category (well-known & esoteric vs. personal fact) × Country (Vt.) 0.04 0.01 341.34 4.50 <0.001 ***
Category (well-known vs. esoteric fact) × Country (Vt.) 0.06 0.02 340.19 3.74 <0.001 ***

The first orthogonal contrast compared the two “religious” categories to the three “fact” categories (“Category (Religoius vs. fact)”). This parallels the previous analyses, and the results are similar: Overall, participants were more likely to circle “believe” for religious questions than fact questions, and this tendency was diminished in Ghana and exaggerated in Thailand.

The second orthogonal contrast compared Christian to Buddhist “religious” questions. Overall, participants were more likely to circle “believe” for Christian questions, and this tendency was exaggerated in Ghana and Vanuatu (which were predominantly Christian samples) and diminished in Thailand and China (which were more Buddhist samples).

The third orthogonal contrast compared well-known and esoteric facts, on the one hand, to personal facts, on the other. Overall, participants were more likely to circle “believe” for well-known and esoteric facts, and this tendency was diminished in Ghana and China, and exaggerated in Thailand and Vanuatu.

The fourth orthogonal contrast compared well-known to esoteric facts. Overall, particpants were more likely to circle “believe” for well-known factrs, and then tendency was diminished in China, and exaggerated in Vanuatu.

Note that these findings statistically control for differences across samples in the overall rate of circling “believe” (which was generally higher in Ghana and lower in Thailand).

Analysis: Based on preregistration

From preregistration:

“Survey 1: We will conduct a 5 (Site: China vs. Thailand vs. Vanuatu vs. Ghana vs. United States) x 2 (Statement Type: religion vs. fact) mixed ANOVA with repeated measures on the second factor and the proportion of trials on which participants completed sentences using a form the word “believe” (or its respective translation) as the dependent measure. To look for finer-grained differences between different religious and factual statements, we will also conduct a 5 (Site: China vs. Thailand vs. Vanuatu vs. Ghana vs. United States) x 5 (Statement Type: Buddhist religious statements vs. Christian religious statements vs. life facts vs. well-known facts vs. esoteric facts) mixed ANOVA with repeated measures on the second factor and the proportion of trials on which participants completed sentences using a form of the word “believe” (or its respective translation) as the dependent measure. In all cases where omnibus ANOVAs are significant, we will conduct pairwise analyses comparing each statement type with each other statement type and each site with each other site."

d1_anova <- d1_long %>%
  distinct(thb1_subj, country, super_cat, question, believe) %>%
  group_by(thb1_subj, country, super_cat) %>%
  summarise(prop_believe = mean(believe)) %>%
  ungroup() %>%
  mutate(thb1_subj = factor(thb1_subj))

contrasts(d1_anova$country) <- contrast_country
contrasts(d1_anova$super_cat) <- contrast_super_cat

Prereg Analysis #1

Here is the first preregistered analyis: a 5 (country) x 2 (question category) mixed ANOVA with repeated measures on the second factor and the proportion of trials on which participants circled “berlieve” as the DV.

r1.4 <- d1_anova %>%
  anova_test(dv = prop_believe, 
             wid = thb1_subj, 
             between = country, 
             within = super_cat)

get_anova_table(r1.4)
ANOVA Table (type III tests)

             Effect DFn DFd       F        p p<.05   ges
1           country   4 339  11.390 1.10e-08     * 0.043
2         super_cat   1 339 580.443 1.94e-75     * 0.533
3 country:super_cat   4 339  11.224 1.46e-08     * 0.081

This analysis aligns with the regressions above, suggesting that participants’ tendency to circle “believe” varied by country/language (country) and by question category (super_cat), and the difference between question category varied across countries/languages (i.e., there was an interaction: country:super_cat).

The preregistration indicated that we’d conduct pairwise follow-up analyses comparing the two question categories and comparing pairs of countires/languages – but I don’t really think we’re interested in comparing pairs of countries/languages, so I’m going to skip that for now. Instead, I’ll compare the two questions categories within each country/language (to explore the significant interaction).

Here we go:

Comparing question categories

r1.5a <- t.test(prop_believe ~ super_cat, paired = T, d1_anova); r1.5a

    Paired t-test

data:  prop_believe by super_cat
t = 24.783, df = 343, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3836875 0.4498396
sample estimates:
mean of the differences 
              0.4167636 

Collapsing across countries/languages, participants circled significantly more “believe” responses for questions in the religious category (42%) than they did for questions in the fact category (NA%).

Comparing question categories within countries/languages

# US
r1.5b_us <- t.test(prop_believe ~ super_cat, paired = T,
                   d1_anova %>% filter(country == "US")); r1.5b_us

    Paired t-test

data:  prop_believe by super_cat
t = 11.179, df = 75, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3986478 0.5715276
sample estimates:
mean of the differences 
              0.4850877 
# Ghana
r1.5b_gh <- t.test(prop_believe ~ super_cat, paired = T,
                   d1_anova %>% filter(country == "Ghana")); r1.5b_gh

    Paired t-test

data:  prop_believe by super_cat
t = 6.6368, df = 47, p-value = 2.909e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1316330 0.2461448
sample estimates:
mean of the differences 
              0.1888889 
# Thailand
r1.5b_th <- t.test(prop_believe ~ super_cat, paired = T,
                   d1_anova %>% filter(country == "Thailand")); r1.5b_th

    Paired t-test

data:  prop_believe by super_cat
t = 16.586, df = 74, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.4669138 0.5944196
sample estimates:
mean of the differences 
              0.5306667 
# China
r1.5b_ch <- t.test(prop_believe ~ super_cat, paired = T,
                   d1_anova %>% filter(country == "China")); r1.5b_ch

    Paired t-test

data:  prop_believe by super_cat
t = 7.3784, df = 47, p-value = 2.186e-09
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.2747757 0.4807798
sample estimates:
mean of the differences 
              0.3777778 
# Vanuatu
r1.5b_vt <- t.test(prop_believe ~ super_cat, paired = T,
                   d1_anova %>% filter(country == "Vanuatu")); r1.5b_vt

    Paired t-test

data:  prop_believe by super_cat
t = 17.054, df = 96, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3598187 0.4546143
sample estimates:
mean of the differences 
              0.4072165 

The difference between question categories was significant in each country/language considered alone.

Analysis: Religion and religiosity

Demographics

First, let’s just look at how people in different countries replied to the relevant questions.

thb1_demo_regp: “Are you a part of any religious group?”

thb1_demo_regp_1_TEXT: “Are you a part of any religious group? If yes, what group?”

thb1_demo_rely: “From 1 to 7, how religious are you? (1 = not religious at all, 7 = extremely religious)”

Seems to have been omitted in Thailand?

thb1_demo_impr: “From 1 to 7, how important to you is your religious practice? (1 = not important at all, 7 = of utmost importance)”

Seems to have been omitted in Thailand?

thb1_demo_wors: “How often do you attend places of worship?”

thb1_demo_bgod: “What best describes your level of belief in God?”

thb1_demo_bbuh: “What best describes your level of belief in Buddha?”

thb1_demo_bosp: “What best describes your level of belief in another spiritual being (other than God or Buddha)?”

thb1_demo_atsn: "What best describes your attitude towards the supernatural?

thb1_demo_imsn: “From 1 to 7, how important to you is your attitude toward the supernatural? (1 = not important at all, 7 = of utmost importance)”

Analyses

Now, let’s look at how responses to our think/believe questions might have varied depending on religiosity/etc. For now, I’ll just focus on a couple of variables that seem to have been answered in reasonable ways.

thb1_demo_rely: “From 1 to 7, how religious are you? (1 = not religious at all, 7 = extremely religious)”

r1.6 <- lmer(believe ~ super_cat * country * thb1_demo_rely_num
             + (1 + super_cat | thb1_subj) + (1 | question),
             data = d1_long %>% 
               filter(country != "Thailand") %>%
               mutate(thb1_demo_rely_num = scale(thb1_demo_rely_num)),
             contrasts = list(country = "contr.sum"))
contrasts dropped from factor country due to missing levelscontrasts dropped from factor country due to missing levelscontrasts dropped from factor country due to missing levelscontrasts dropped from factor country due to missing levels
Parameter β β' β'' Std. Err. df t p
Intercept 0.61 - - 0.03 26.22 22.64 <0.001 ***
Category (religious) 0.20 0.39 0.39 0.03 32.87 6.80 <0.001 ***
Country (US) -0.03 -0.04 -0.04 0.01 258.00 -2.09 0.037 *
Country (Ghana) 0.10 0.14 0.14 0.02 258.00 5.69 <0.001 ***
Country (China) -0.04 -0.06 -0.06 0.02 258.00 -2.48 0.014 *
How religious are you? 0.00 -0.01 -0.01 0.01 258.00 -0.57 0.567
Category (religious) × Country (US) 0.05 0.08 0.08 0.02 258.00 2.77 0.006 **
Category (religious) × Country (Ghana) -0.11 -0.16 -0.16 0.02 258.00 -4.38 <0.001 ***
Category (religious) × Country (China) 0.05 0.08 0.08 0.03 258.00 2.01 0.045 *
Category (religious) × How religious are you? 0.03 0.06 0.06 0.01 258.00 2.34 0.020 *
Country (US) × How religious are you? 0.02 0.03 0.03 0.01 258.00 1.81 0.071
Country (Ghana) × How religious are you? -0.03 -0.04 -0.04 0.01 258.00 -1.90 0.059
Country (China) × How religious are you? 0.00 0.00 0.00 0.02 258.00 0.08 0.933
Category (religious) × Country (US) × How religious are you? -0.01 -0.02 -0.02 0.02 258.00 -0.67 0.504
Category (religious) × Country (Ghana) × How religious are you? -0.02 -0.03 -0.03 0.02 258.00 -0.81 0.418
Category (religious) × Country (China) × How religious are you? 0.04 0.06 0.06 0.02 258.00 1.80 0.073

This analysis suggests that greater religiosity was associated with an increased distinction between religious and fact questions. (Note that this analysis omits participants from Thailand, who did not answer this question about religiosity.)

thb1_demo_impr: “From 1 to 7, how important to you is your religious practice? (1 = not important at all, 7 = of utmost importance)”

r1.7 <- lmer(believe ~ super_cat * country * thb1_demo_impr_num
             + (1 + super_cat | thb1_subj) + (1 | question),
             data = d1_long %>% 
               filter(country != "Thailand") %>%
               mutate(thb1_demo_impr_num = scale(thb1_demo_impr_num)),
             contrasts = list(country = "contr.sum"))
contrasts dropped from factor country due to missing levelscontrasts dropped from factor country due to missing levelscontrasts dropped from factor country due to missing levelscontrasts dropped from factor country due to missing levels
Parameter β β' β'' Std. Err. df t p
Intercept 0.61 - - 0.03 26.04 22.36 <0.001 ***
Category (religious) 0.19 0.37 0.37 0.03 32.47 6.49 <0.001 ***
Country (US) -0.02 -0.04 -0.04 0.01 254.96 -1.81 0.071
Country (Ghana) 0.09 0.13 0.13 0.02 254.96 5.81 <0.001 ***
Country (China) -0.04 -0.06 -0.06 0.02 254.96 -2.42 0.016 *
How important is your religious practice? 0.00 0.00 0.00 0.01 254.96 -0.16 0.871
Category (religious) × Country (US) 0.06 0.10 0.10 0.02 255.00 3.35 <0.001 ***
Category (religious) × Country (Ghana) -0.11 -0.16 -0.16 0.02 255.00 -4.45 <0.001 ***
Category (religious) × Country (China) 0.03 0.04 0.04 0.03 255.00 1.12 0.263
Category (religious) × How important is your religious practice? 0.03 0.05 0.05 0.01 255.00 2.13 0.034 *
Country (US) × How important is your religious practice? 0.02 0.03 0.03 0.01 254.96 1.70 0.090
Country (Ghana) × How important is your religious practice? -0.03 -0.04 -0.04 0.02 254.96 -1.84 0.067
Country (China) × How important is your religious practice? -0.01 -0.01 -0.01 0.02 254.96 -0.34 0.738
Category (religious) × Country (US) × How important is your religious practice? 0.01 0.02 0.02 0.02 255.00 0.62 0.535
Category (religious) × Country (Ghana) × How important is your religious practice? -0.01 -0.01 -0.01 0.02 255.00 -0.30 0.762
Category (religious) × Country (China) × How important is your religious practice? 0.01 0.01 0.01 0.02 255.00 0.28 0.776

This analysis suggests that more importance placed on religious practice was associated with an increased distinction between religious and fact questions. (Note that this analysis omits participants from Thailand, who did not answer this question about religiosity.)

thb1_demowors: “How often do you attend places of worship?”

r1.8 <- lmer(believe ~ super_cat * country * thb1_demo_wors_num
             + (1 + super_cat | thb1_subj) + (1 | question),
             data = d1_long %>% 
               mutate(thb1_demo_wors_num = scale(thb1_demo_wors_num)))
Parameter β β' β'' Std. Err. df t p
Intercept 0.59 - - 0.03 28.96 21.48 <0.001 ***
Category (religious) 0.22 0.43 0.43 0.03 37.04 7.39 <0.001 ***
Country (Gh.) 0.11 0.13 0.13 0.02 317.02 5.98 <0.001 ***
Country (Th.) -0.02 -0.02 -0.02 0.01 317.02 -1.18 0.240
Country (Ch.) -0.08 -0.09 -0.09 0.03 317.02 -2.49 0.013 *
Country (Vt.) -0.01 -0.01 -0.01 0.02 317.02 -0.41 0.679
How often do you attend places of worship? -0.02 -0.04 -0.04 0.01 317.02 -2.36 0.019 *
Category (religious) × Country (Gh.) -0.15 -0.18 -0.18 0.03 317.02 -5.68 <0.001 ***
Category (religious) × Country (Th.) 0.05 0.07 0.07 0.02 317.02 2.54 0.011 *
Category (religious) × Country (Ch.) 0.04 0.05 0.05 0.04 317.02 1.01 0.311
Category (religious) × Country (Vt.) -0.01 -0.02 -0.02 0.03 317.02 -0.41 0.680
Category (religious) × How often do you attend places of worship? 0.03 0.05 0.05 0.01 317.02 2.04 0.042 *
Country (Gh.) × How often do you attend places of worship? -0.01 -0.01 -0.01 0.02 317.02 -0.36 0.721
Country (Th.) × How often do you attend places of worship? -0.02 -0.03 -0.03 0.02 317.02 -1.40 0.161
Country (Ch.) × How often do you attend places of worship? -0.02 -0.03 -0.03 0.02 317.02 -1.01 0.313
Country (Vt.) × How often do you attend places of worship? 0.03 0.03 0.03 0.02 317.02 1.34 0.180
Category (religious) × Country (Gh.) × How often do you attend places of worship? 0.01 0.02 0.02 0.03 317.02 0.49 0.623
Category (religious) × Country (Th.) × How often do you attend places of worship? -0.04 -0.05 -0.05 0.02 317.02 -1.58 0.115
Category (religious) × Country (Ch.) × How often do you attend places of worship? 0.03 0.04 0.04 0.03 317.02 0.86 0.393
Category (religious) × Country (Vt.) × How often do you attend places of worship? -0.03 -0.04 -0.04 0.03 317.02 -0.99 0.323

This analysis suggests that frequency of attendence was associated with an increased distinction between religious and fact questions.

LS0tCnRpdGxlOiAiVGhpbmsgQmVsaWV2ZSAxIChmb3JjZWQgY2hvaWNlKSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cH0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGLCBtZXNzYWdlID0gRikKYGBgCgpJbiB0aGlzIG5vdGVib29rIHdlIGFuYWx5emUgdGhlIGZpcnN0ICJ0aGluay9iZWxpZXZlIiB0YXNrLCBpbiB3aGljaCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIGEgc2VyaWVzIG9mIGZpbGwtaW4tdGhlLWJsYW5rcyBieSBjaG9vc2luZyBiZXR3ZWVuIHR3byBvcHRpb25zOiAidGhpbmsiIGFuZCAiYmVsaWV2ZS4iCgoKYGBge3J9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3J9CmQxX3JhdyA8LSByZWFkX3hsc3goIi4uL2RhdGEvVGhpbmtCZWxpZXZlMV9vcmdhbml6ZWQueGxzeCIsIHNoZWV0ID0gIlYxJlYyIG5vIGR1cGVzIikgJT4lCiAgIyBlbGltaW5hdGUgb25lIGR1cGxpY2F0ZQogIGdyb3VwX2J5KHRoYjFfc3ViaikgJT4lCiAgdG9wX24oMSwgdGhiMV9iYXRjKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0aGIxX2N0cnkgPSBmYWN0b3IodGhiMV9jdHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSkpCmBgYAoKYGBge3J9CmtleTEgPC0gcmVhZF94bHN4KCIuLi9kYXRhL1RoaW5rQmVsaWV2ZTFfb3JnYW5pemVkLnhsc3giLCBzaGVldCA9IDEpWzEsXSAlPiUgCiAgdCgpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb24iKSAlPiUKICByZW5hbWUocXVlc3Rpb25fdGV4dCA9ICIuIikgJT4lCiAgIyBnZXQgcmlkIG9mIHdoaXRlIHNwYWNlCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCJcXHMrIiwgIiAiLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgIyBoYW5kIGNvZGUgcXVlc3Rpb24gY2F0ZWdvcmllcwogIG11dGF0ZShjYXRlZ29yeSA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJmaW5hbCBwYXBlciIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImhpZ2h3YXkgaW50byB0b3duIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiZ3JvY2VyeSBzdG9yZSIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImNoZW1pc3RyeSBib29rIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiY29va2luZyBub29kbGVzIiwgcXVlc3Rpb25fdGV4dCkgfiAibGlmZSBmYWN0IiwKICAgIGdyZXBsKCJwcmF5aW5nIHRvIEdvZCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImFuZ2VscyBkZWxpdmVyIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiZ28gdG8gSGVhdmVuIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiY2hhbmdlZCB3YXRlciIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImh1bWFuIHNpbnMiLCBxdWVzdGlvbl90ZXh0KSB+ICJDaHJpc3RpYW4gcmVsaWdpb3VzIiwKICAgIGdyZXBsKCJjeWNsZSBvZiBkZWF0aCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoIkJ1ZGRoYSBmb3VuZCBzcGlyaXR1YWwiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJsb3R1cyBmbG93ZXIgYmxvb21lZCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImdob3N0cyBzdWZmZXIiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJidXJuaW5nIGluY2Vuc2UiLCBxdWVzdGlvbl90ZXh0KSB+ICJCdWRkaGlzdCByZWxpZ2lvdXMiLAogICAgZ3JlcGwoIm1vb24gZ29lcyBhcm91bmQiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJCYXJhY2sgT2JhbWEiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJ1c2luZyBiYXR0ZXJpZXMiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJCcmF6aWwiLCBxdWVzdGlvbl90ZXh0KSB8CiAgICAgIGdyZXBsKCJhbmNpZW50IFJvbWFuIiwgcXVlc3Rpb25fdGV4dCkgfiAid2VsbC1rbm93biBmYWN0IiwKICAgIGdyZXBsKCJvY3RvcHVzIiwgcXVlc3Rpb25fdGV4dCkgfAogICAgICBncmVwbCgiSm9obiBCcm93biIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoInRhbGxlciBtb3VudGFpbiIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoInNwZWNpZXMgb2YgZmlzaCIsIHF1ZXN0aW9uX3RleHQpIHwKICAgICAgZ3JlcGwoImNvbnRhaW5zIG1vcmUgY29wcGVyIiwgcXVlc3Rpb25fdGV4dCkgfiAiZXNvdGVyaWMgZmFjdCIsCiAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykpICU+JQogIG11dGF0ZShjYXRlZ29yeSA9IGZhY3RvcihjYXRlZ29yeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkNocmlzdGlhbiByZWxpZ2lvdXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnVkZGhpc3QgcmVsaWdpb3VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlbGwta25vd24gZmFjdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc290ZXJpYyBmYWN0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpZmUgZmFjdCIpKSwKICAgICAgICAgc3VwZXJfY2F0ID0gY2FzZV93aGVuKGdyZXBsKCJmYWN0IiwgY2F0ZWdvcnkpIH4gImZhY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoInJlbGlnaW91cyIsIGNhdGVnb3J5KSB+ICJyZWxpZ2lvdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgICAgICBzdXBlcl9jYXQgPSBmYWN0b3Ioc3VwZXJfY2F0LCBsZXZlbHMgPSBjKCJyZWxpZ2lvdXMiLCAiZmFjdCIpKSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJvcmRlciIpICU+JQogIG11dGF0ZShvcmRlciA9IGFzLm51bWVyaWMob3JkZXIpLAogICAgICAgICBxdWVzdGlvbl90ZXh0ID0gZ3N1Yigi4oCaw4TDtCIsICInIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHF1ZXN0aW9uX3RleHRfc2hvcnQgPSBnc3ViKCJeLip0aGF0ICIsICIuLi4iLCBxdWVzdGlvbl90ZXh0KSwKICAgICAgICAgdmFyX25hbWUgPSBuYW1lcyhkMV9yYXdbbmFtZXMoZDFfcmF3KSAhPSAidGhiMV92ZXJzaW9uIl0pKQpgYGAKCmBgYHtyfQpkMSA8LSBkMV9yYXcgJT4lCiAgZmlsdGVyKHRoYjFfY3RyeSAlaW4lIGxldmVsc19jb3VudHJ5KSAlPiUKICBtdXRhdGUodGhiMV9jdHJ5ID0gZmFjdG9yKHRoYjFfY3RyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpLAogICAgICAgICB0aGIxX2RlbW9fc2V4ID0gZmFjdG9yKHRoYjFfZGVtb19zZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTWFsZSIsICJGZW1hbGUiLCAiT3RoZXIiKSksIAogICAgICAgICB0aGIxX2RlbW9fYWdlID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodGhiMV9kZW1vX2FnZSkpKSAlPiUKICBtdXRhdGVfYXQodmFycyh0aGIxX2RlbW9fcmVncCwgdGhiMV9kZW1vX29sYW5nKSwKICAgICAgICAgICAgZnVucyhmYWN0b3IoLiwgbGV2ZWxzID0gYygiTk8iLCAiWUVTIikpKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnModGhiMV9kZW1vX3JlbHksIHRoYjFfZGVtb19pbXByLCB0aGIxX2RlbW9faW1zbiksIAogICAgICAgICAgICBmdW5zKGZhY3RvciguLCBsZXZlbHMgPSAxOjcpKSkgJT4lCiAgbXV0YXRlKHRoYjFfZGVtb193b3JzID0gZmFjdG9yKHRoYjFfZGVtb193b3JzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTmV2ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT25jZSBhIHllYXIgb3IgbGVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgZmV3IHRpbWVzIGEgeWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uY2Ugb3IgdHdpY2UgYSBtb250aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZXJ5IHdlZWsgb3IgbW9yZSBvZnRlbiIpKSwKICAgICAgICAgdGhiMV9kZW1vX2Jnb2QgPSBmYWN0b3IodGhiMV9kZW1vX2Jnb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vdCBhdCBhbGwgYmVsaWV2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGlldmUgc2xpZ2h0bHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxpZXZlIG1vZGVyYXRlbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxpZXZlIHN0cm9uZ2x5IikpLAogICAgICAgICB0aGIxX2RlbW9fYmJ1aCA9IGZhY3Rvcih0aGIxX2RlbW9fYmJ1aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm90IGF0IGFsbCBiZWxpZXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsaWV2ZSBzbGlnaHRseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGlldmUgbW9kZXJhdGVseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGlldmUgc3Ryb25nbHkiKSksCiAgICAgICAgIHRoYjFfZGVtb19ib3NwID0gZmFjdG9yKHRoYjFfZGVtb19ib3NwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJOb3QgYXQgYWxsIGJlbGlldmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxpZXZlIHNsaWdodGx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsaWV2ZSBtb2RlcmF0ZWx5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmVsaWV2ZSBzdHJvbmdseSIpKSwKICAgICAgICAgdGhiMV9kZW1vX2F0c24gPSBmYWN0b3IodGhiMV9kZW1vX2F0c24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgc3VwZXJuYXR1cmFsIGZvcmNlcyBvciBiZWluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZSBjYW5ub3Qga25vdyBpZiB0aGVyZSBhcmUgc3VwZXJuYXR1cmFsIGZvcmNlcyBhbmQgYmVpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgbWlnaHQgYmUgc3VwZXJuYXR1cmFsIGZvcmNlcyBhbmQgYmVpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwZXJuYXR1cmFsIGZvcmNlcyBhbmQgYmVpbmdzIGV4aXN0IGJ1dCB3ZSBjYW5ub3Qga25vdyB3aGF0IHRoZXkgYXJlIGxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBkZWZpbml0ZWx5IGFyZSBzdXBlcm5hdHVyYWwgZm9yY2VzIGFuZCBiZWluZ3MiKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKHRoYjFfZGVtb19yZWx5LCB0aGIxX2RlbW9faW1wciwgdGhiMV9kZW1vX3dvcnMsIHRoYjFfZGVtb19iZ29kLCAKICAgICAgICAgICAgICAgICB0aGIxX2RlbW9fYmJ1aCwgdGhiMV9kZW1vX2Jvc3AsIHRoYjFfZGVtb19hdHNuLCB0aGIxX2RlbW9faW1zbiksIAogICAgICAgICAgICBmdW5zKG51bSA9IGFzLm51bWVyaWMoLikgLSAxKSkgJT4lCiAgbXV0YXRlKHJlbGlnaW9uID0gY2FzZV93aGVuKAogICAgdGhiMV9kZW1vX3JlZ3BfMV9URVhUICVpbiUgYygiQW5nbGljYW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZ2xpY2FuL1NEQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBb0ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQS5PLkcgeW91dGggZ3JvdXAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFudWNob24gQ2h1cmNoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBT0c6IFlvdXRoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcG9zdG9saWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpYmxlIENodXJjaCAmIENNQyBDaHVyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmlibGUgY2h1cmNoIGFuZCBQcmVzYnl0ZXJpYW4gY2h1cmNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsYWNrIENhbXB1cyBNaW5pc3RyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1wdXMgY3J1c2FkZSBmb3IgQ2hyaXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhdGhvbGljIENocmlzdGlhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXRob2xpYyBDaHVyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VsbCBncm91cCBBbnVjaG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNGLCBZb3V0aCBNaW5pc3RyeSBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNob3J1cyB5b3V0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHJpc3RpYW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNocmlzdGlhbiBob3VzZSBjaHVyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hyaXN0aWFuIC0gTWV0aG9kaXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNocmlzdGlhbiAtIFBlbnRlY29zdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hyaXN0aWFuIC0gUm9tYW4gQ2F0aG9saWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hyaXN0aWFuIChDYXRob2xpYykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNocmlzdGlhbiAoUGVudGVjb3N0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHJpc3RpYW4gKFBvdHRlcnMgaGFuZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hyaXN0aWFuIChSb21hbikiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNocmlzdGlhbiBjaHVyY2ggaW4gU29wIFRpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHJpc3RpYW4gRmVsbG93c2hpcCBHcm91cCAoQ0YpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHJpc3RpYW5pdHkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNocmlzdGlhbml0eSAob3ZlcmNvbWVycyBhbmQgQ29uZ3Jlc3MgSW50LiBDaHVyY2gpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNocmlzdGlhbml0eSAoUm9tYW4gQ2F0aG9saWMpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHJpc3RpYW5pdHkgKFJvbWFuKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hyaXN0aWFucyBvbiBDYW1wdXMgU0pTVSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHVyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2h1cmNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNodXJjaCBZb3V0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHVyY2ggWW91dGggYW5kIFJlbGlnaW91cyBTaW5naW5nIEdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNodXJjaCB5b3V0aHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNodXJjaCwgWW91dGggZmVsbG93c2hpcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaHVyY2g6IFN1bmRheSBTY2hvb2wgKyBTZXJ2aWNlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21tdW5pdHkgUHJheWVyIGdyb3VwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21tdW5pdHkgUHJheWVyIEdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQuUi5FLkEuTSBDYW1wdXMgTWluaXN0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1hbHVzIHJlbGlnaW91cyBncm91cCwgc3R1ZGVudCBsaWZlIGFzc29jaWF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVwYXV0byBjaHVyY2ggKFBvcnQgVmlsYSkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhdGhlcidzIEhvdXNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYXRoZXJzIGhvdXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZlbGxvd3NoaXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJpZW5kIGdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdsb3Jpb3VzIGNodXJjaCBwZW9wbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2xvdXJpc2UgQ2h1cmNoIGdvaW5nIGFuZCBwcmF5IGZvciBzaWNrIHBlb3BsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHbyB0byBDYXRob2xpYyBjaHVyY2ggZXZlcnkgU3VuZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvIHRvIGNodXJjaCBldmVyeSBTdW5kYXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCB0byBjaHVyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28gdG8gY2h1cmNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIG9mIFlvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvdXNlIGNodXJjaCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG91c2UgY2h1cmNoIG9mIENocmlzdGlhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJIGFtIHBhcnQgb3IgbWVtYmVyIG9mIFBvdG9yb2tpIHlvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklDT01CIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKZWhvdmEncyBXaXRuZXNzZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmVob3ZhaCdzIFdpdG5lc3NlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqb3kgd2l0aCBNdW5pY2lwYWxpdHkgZ3JvdXAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkp1c3QgWW91dGgncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLaWRzIHByYXllciB3YXJyaW9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktvcmVhbiBDYW1wdXMgQ3J1c2FkZSBmb3IgQ2hyaXN0PyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLWUIgLSBLbm93aW5nIFlvdXIgQmlibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTERTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxEUyBNb3Jtb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGVhZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlYWRlciBvZiB0aGUgWW91dGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGl2aW5nIHdhdGVyLCBIZXJhbSBwcmFpc2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpc3RlbiB0byBzZXJtb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWwgY2h1cmNoZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFlIEthIEJvbyBDaHVyY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtYmVyIG9mIHRoZSB5b3V0aCwgY2hpbGRyZW4gY2xhc3MgdGVhY2hlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzb25ldHRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3Jtb24gaGVscGluZyBoYW5kcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOVE0gWW91dGgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgUC5SLkMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFzdG9yIGFuZCBBcG9zdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGhmaW5kZXIsIEFtYmFzc2Fkb3IsIFlvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdGh3YXkgTWluaXN0cnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByYWlzZSAmIHdvcnNoaXAsIHZpc2l0YXRpb24sIGNvbWJpbmUgc2VydmljZSwgeW91dGgsIGNob2lyIHByYWN0aWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByYXkgd2FycmlvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmF5aW5nIFN1bmRheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVzYmVydGVudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlc2J5dGVyaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVzYnl0ZXJpYW4gQ2h1cmNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1bHNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb21hbiBDYXRob2xpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSb21hbiBDYXRob2xpYyAodGVjaG5pY2FsbHkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjcmlwdHVyZSBVbmlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0RBIFlvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l5b24gR3JvdXAvIGxpa2UgY2FyZWdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0dWRlbnQgbGlmZSAoVVNQKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VuZGF5IHNjaG9vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdW5kYXkgc2Nob29sLCB5b3V0aCBldGMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VuZGF5IFNjaG9vbCwgQmlibGUgc3R1ZHkgYW5kIFlvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bmRheSBTY2hvb2wsIFlvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlYWNoZXIgZm9yIFNhYmJ0aCBTY2hvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FyZCBDaG9pciwgRWxkZXIncyBxdW9yZW0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhdGNobmlnaHQgc2VydmljZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXRjaG5pZ2h0IHNlcnZpY2Ugb3JkaW5hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXb3JkcyBDaHJpc3RpYW4gZmVsbG93c2hpcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZXMga2F3YXJpa2kgUy5ELkEgQ2h1cmNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlllcywgUHJheWVyIGdyb3VwLCBDaHVyY2ggSW5zdHJ1bWVudGFsaXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWWVzISBDaHVyY2ggeW91dGggKGRydW1lcikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWWVzISAtIHlvdXRoIGdyb3VwL21pbmlzdHJ5IC1jaGlsZHJlbiBtaW5pc3RyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3VuZyBzaW5nbGUgYWR1bHRzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3V0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3V0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGggQWN0aXZpdGllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3V0aCBGZWxsb3dzaGlwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3V0aCBncm91cCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGggR3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGggbWVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3V0aCBNZW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGggTWVtYmVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3V0aCwgQ2h1cmNoIEJhbmQgYW5kIFdvbWVuJ3MgTWluaXN0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGgsIFN1bmRheSBTY2hvb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGgsIFN1bmRheSBzY2hvb2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdXRoLCBTdW5kYXkgU2Nob29sLCBldGMuLi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91dGgvTWVuJ3MgRmVsbG93c2hpcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3V0aHMgKFBvcnQgVmlsYSkgQW5nbGljYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFlvdXRoKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3V0aHMiKSB+ICJDaHJpc3RpYW4iLAogICAgdGhiMV9kZW1vX3JlZ3BfMV9URVhUICVpbiUgYygiQnVkZGhpc20iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGRoaXNtIGNsdWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnVkZGhpc3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGRoaXN0IGNhbXBpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnVkZGhpc3QgQ2FtcGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRkaGlzdCBDbHViIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGRoaXN0IFN1bmRheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRkaGlzdCwgbWFrZSBtZXJpdCBpbiB0ZW1wbGUsIGdvIHRvIHRlbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFudCAvIE1lcml0IC8gTGlzdGVuaW5nIHRvIEJ1ZGRoaXN0J3MgdGVhY2hpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFjZWJvb2sgdmlsbGFnZSB0ZW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR28gdG8gbmVpZ2hib3IgdGVtcGxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHbyB0byB0ZW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR29pbmcgdG8gdGVtcGxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHdWFuIFlpbiBDaXR0YSAoY3JlYXRlZCBieSBhbiBBdXN0cmFsaWFuIENoaW5lc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9seSBkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9seSBkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFrZSBtZXJpdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFrZSBtZXJpdCBpbiBob2x5IGRheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWtlIG1lcml0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGl0YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaXRhdGlvbiBjYW1waW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lcml0IGdpdmUgZm9vZCB0byBtb25rIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXJpdCwgZ29pbmcgdG8gdGVtcGxlIGluIGhvbHkgZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lcml0IGdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbmsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIG1ha2UgbWVyaXQsIGxpc3RlbmluZyB0byBCdWRkaGlzdCBpcyB0ZWFjaGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byB0ZW1wbGUiKSB+ICJCdWRkaGlzdCIsCiAgICBpcy5uYSh0aGIxX2RlbW9fcmVncF8xX1RFWFQpIHwKICAgICAgdGhiMV9kZW1vX3JlZ3BfMV9URVhUICVpbiUgYygibWRhdGEiLCAiTWlzc2luZyBEYXRhIiwgIm5vdCB0cmFucyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgdHJhbnMiLCAibm9uZSIpIH4gTkFfY2hhcmFjdGVyXywKICAgIFRSVUUgfiAiT3RoZXIiCiAgKSkKCmNvbnRyYXN0cyhkMSR0aGIxX2N0cnkpID0gY29udHJhc3RfY291bnRyeQpgYGAKCmBgYHtyfQpkMV9sb25nIDwtIGQxICU+JQogIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIHRoYjFfZ2hvc3RzaHVuZ2VyOnRoYjFfb2JhbWEpICU+JQogIG11dGF0ZSh0aGluayA9IGlmZWxzZShncmVwbCgidGhpbmsiLCByZXNwb25zZSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJ0aG91Z2h0IiwgcmVzcG9uc2UpLCBULCBGKSwKICAgICAgICAgYmVsaWV2ZSA9IGlmZWxzZShncmVwbCgiYmVsaWUiLCByZXNwb25zZSksIFQsIEYpLAogICAgICAgICByZXNwb25zZV9jYXQgPSBjYXNlX3doZW4oYmVsaWV2ZSA9PSBUIH4gImJlbGlldmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmsgPT0gVCB+ICJ0aGluayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IGZhY3RvcihyZXNwb25zZV9jYXQsIGxldmVscyA9IGMoInRoaW5rIiwgImJlbGlldmUiKSkpICU+JQogIGxlZnRfam9pbihrZXkxICU+JSBzZWxlY3QoLXF1ZXN0aW9uKSAlPiUgcmVuYW1lKHF1ZXN0aW9uID0gdmFyX25hbWUpKQoKY29udHJhc3RzKGQxX2xvbmckdGhiMV9jdHJ5KSA9IGNvbnRyYXN0X2NvdW50cnkKIyBjb250cmFzdHMoZDFfbG9uZyRjYXRlZ29yeSkgPSBjb250cmFzdF9jYXRlZ29yeQpjb250cmFzdHMoZDFfbG9uZyRjYXRlZ29yeSkgPSBjb250cmFzdF9jYXRlZ29yeV9vcnRoCmNvbnRyYXN0cyhkMV9sb25nJHN1cGVyX2NhdCkgPSBjb250cmFzdF9zdXBlcl9jYXQKYGBgCgpgYGB7cn0KIyBpbXBsZW1lbnQgZXhjbHVzaW9uIGNyaXRlcmlhIGFuZCByZW5hbWUgY291bnRyeSB2YXJpYWJsZQpkMSA8LSBkMSAlPiUgCiAgZmlsdGVyKHRoYjFfb3JkciA9PSAiWWVzIiwgdGhiMV9hdHRuID09ICJQYXNzIikgJT4lCiAgcmVuYW1lKGNvdW50cnkgPSB0aGIxX2N0cnkpCgpkMV9sb25nIDwtIGQxX2xvbmcgJT4lIAogIGZpbHRlcih0aGIxX29yZHIgPT0gIlllcyIsIHRoYjFfYXR0biA9PSAiUGFzcyIpICU+JQogIHJlbmFtZShjb3VudHJ5ID0gdGhiMV9jdHJ5KQpgYGAKCgojIE92ZXJ2aWV3CgpGcm9tIHRoZSBwcmVyZWdpc3RyYXRpb24gKFtsaW5rXShodHRwczovL2FzcHJlZGljdGVkLm9yZy9wNml5My5wZGYpKToKCj4gIk91ciBvdmVyYXJjaGluZyBoeXBvdGhlc2lzIGZvciB0aGUgcHJlc2VudCBzdHVkeSBpcyB0aGF0IFsuLi5dIG90aGVyIGxhbmd1YWdlcyB3aWxsIGhhdmUgYW4gZXBpc3RlbWljIHZlcmIgdGhhdCBpcyBtb3JlIGxpa2VseSB0byBiZSB1c2VkIGZvciByZWxpZ2lvdXMgYXR0aXR1ZGUgcmVwb3J0cyAoc2ltaWxhciB0byBFbmdsaXNoIOKAnGJlbGlldmXigJ0pIGFuZCBhIGRpZmZlcmVudCBlcGlzdGVtaWMgdmVyYiB0aGF0IGlzIG1vcmUgbGlrZWx5IHRvIGJlIHVzZWQgZm9yIG1hdHRlci1vZi1mYWN0IGF0dGl0dWRlIHJlcG9ydHMgKHNpbWlsYXIgdG8gRW5nbGlzaCDigJx0aGlua+KAnSkuIAo+IAo+IEZvciB0aGlzIHN0dWR5LCB3ZSBhcmUgZXhhbWluaW5nIGZpdmUgbGFuZ3VhZ2VzIGluIGZpdmUgcmVnaW9ucyBvZiBpbnRlcmVzdDogKGkpIE1hbmRhcmluIGluIENoaW5hOyAoaWkpIFRoYWkgaW4gVGhhaWxhbmQ7IChpaWkpIEJpc2xhbWEgKGFuIEVuZ2xpc2gtYmFzZWQgY3Jlb2xlCmxhbmd1YWdlKSBvbiB0aGUgTWVsYW5lc2lhbiBJc2xhbmQgb2YgVmFudWF0dTsgKGl2KSBGYW50ZSBpbiBHaGFuYTsgYW5kICh2KSBBbWVyaWNhbiBFbmdsaXNoIGluIHRoZSBCYXkgQXJlYSwgQ2FsaWZvcm5pYS4gCj4gCj4gV2UgdGh1cyBoYXZlIGZpdmUgbW9yZSBzcGVjaWZpYyBzdWItaHlwb3RoZXNlcy4gRm9yIGVhY2ggb2YgdGhlIGZpcnN0IGZvdXIgbGFuZ3VhZ2VzIC8gcmVnaW9ucyBvZiBpbnRlcmVzdCwgd2UgaHlwb3RoZXNpemUgdGhhdCBhIHNldCBvZiB3b3JkcyBvciBwaHJhc2VzIGV4aXN0cyB3aG9zZSB1c2FnZSBwYXJhbGxlbHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB1c2FnZSBvZiDigJx0aGlua+KAnSBhbmQg4oCcYmVsaWV2ZeKAnSBpbiBBbWVyaWNhbiBFbmdsaXNoLCB3aXRoIG9uZSB3b3JkIG9yIHBocmFzZSAodGhlIOKAnHRoaW5r4oCdIGFuYWxvZ3VlKSBiZWluZyB1c2VkIGZvciBtb3JlIG1hdHRlci1vZi1mYWN0IGF0dGl0dWRlIHJlcG9ydHMgYW5kIHRoZSBvdGhlciAodGhlIOKAnGJlbGlldmXigJ0gYW5hbG9ndWUpIGJlaW5nIG1vcmUgbGlrZWx5IHRvIGJlIHVzZWQgZm9yIHJlbGlnaW91cyBhdHRpdHVkZSByZXBvcnRzLiBUaGF0IGdpdmVzIHVzIG91ciBmaXJzdCBmb3VyIHN1Yi1oeXBvdGhlc2VzOiB0aGF0IE1hbmRhcmluLCBUaGFpLCBCaXNsYW1hIGFuZCBGYW50ZSBzcGVha2VycyB3aWxsIGVhY2ggdXNlIHR3byBkaWZmZXJlbnQgd29yZHMgaW4gYSBtYW5uZXIgcGFyYWxsZWwgdG8gdGhlIHVzZSBvZgrigJx0aGlua+KAnSBhbmQg4oCcYmVsaWV2ZeKAnSBpbiBhbiBBbWVyaWNhbiBFbmdsaXNoIHNldHRpbmcgYXMgaWRlbnRpZmllZCBieSBIZWlwaGV0eiwgTGFuZGVycywgYW5kIFZhbiBMZWV1d2VuLiBPdXIgZmlmdGggc3ViLWh5cG90aGVzaXMgaXMgdGhhdCB0aGUgQmF5IEFyZWEgcG9ydGlvbiBvZiB0aGUgc3R1ZHkgd2lsbCByZXBsaWNhdGUgdGhlIHJlc3VsdHMgb2YgdGhlIGVhcmxpZXIgc3R1ZHkgb2YgSGVpcGhldHosIExhbmRlcnMsIGFuZCBWYW4gTGVldXdlbi4iCgoKPHAgc3R5bGU9ImNvbG9yOmRhcmtyZWQiPioqS1cgRVhFQ1VUSVZFIFNVTU1BUlkgKDIwMjAtMDEtMTkpOiBXZSByZXBsaWNhdGVkIHRoZSBvcmlnaW5hbCBmaW5kaW5nIGluIHRoZSBVUzogcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3IgcmVsaWdpb3VzIHRoYW4gZmFjdCBxdWVzdGlvbnMuIFdlIGZvdW5kIHRoZSBzYW1lIHBhdHRlcm4gaW4gYWxsIGZpdmUgY291bnRyaWVzL2xhbmdhdWdlcyBpbmNsdWRlZCBpbiB0aGlzIHN0dWR5LioqPC9wPgoKPHAgc3R5bGU9ImNvbG9yOmRhcmtyZWQiPioqVGhlIHBhdHRlcm4gd2FzIHNvbWV3aGF0IHdlYWtlciBpbiBHaGFuYS9GYW50ZSB0aGFuIGluIG90aGVyIGNvdW50cmllcy9sYW5ndWFnZSAodGhvdWdoIGl0IHdhcyBzdGlsbCBzaWduaWZpY2FudCksIGFuZCB0aGUgcGF0dGVybiB3YXMgc29tZXdoYXQgc3Ryb25nZXIgaW4gVGhhaWxhbmQvVGhhaSB0aGFuIGluIG90aGVyIGNvdW50cmllcy9sYW5ndWFnZXMuKio8L3A+CgoKIyBTYW1wbGVzCgpCZWZvcmUgd2UgYmVnaW4sIGl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB3ZSBoYWQgdW5lcXVhbCBzYW1wbGUgc2l6ZXMgYnkgY291bnRyeToKCmBgYHtyfQpkMV9yYXcgJT4lIGNvdW50KHRoYjFfY3RyeSkKYGBgCgpIb3dldmVyLCBgciBkMV9yYXcgJT4lIGZpbHRlcih0aGIxX29yZHIgPT0gIk5vIikgJT4lIGNvdW50KCkgJT4lIGFzLm51bWVyaWMoKWAgcGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGlzIHRhc2sgYWZ0ZXIgY29tcGxldGluZyBvdGhlciBzdXJ2ZXlzLCBhbmQgYW4gYWRkaXRpb25hbCBgciBkMV9yYXcgJT4lIGZpbHRlcih0aGIxX29yZHIgPT0gIlllcyIsIHRoYjFfYXR0biA9PSAiRmFpbCIpICU+JSBjb3VudCgpICU+JSBhcy5udW1lcmljKClgIGZhaWxlZCB0aGUgYXR0ZW50aW9uIGNoZWNrLiBJbiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzIEkgd2lsbCBleGNsdWRlIHRoZXNlIHBhcnRpY2lwYW50cywgbGVhdmluZyB1cyB3aXRoIHRoZSBmb2xsb3dpbmcgc2FtcGxlczoKCmBgYHtyfQpkMSAlPiUgY291bnQoY291bnRyeSkKYGBgCgpgYGB7cn0Kc2FtcGxlX3NpemVfZDEgPC0gZDEgJT4lIAogIGNvdW50KGNvdW50cnkpICU+JSAKICBkYXRhLmZyYW1lKCkgJT4lCiAgbXV0YXRlKGNvdW50cnlfbiA9IHBhc3RlMChjb3VudHJ5LCAiIChuPSIsIG4sICIpIiksCiAgICAgICAgIGNvdW50cnlfbiA9IHJlb3JkZXIoY291bnRyeV9uLCBhcy5udW1lcmljKGNvdW50cnkpKSkKYGBgCgoKIyBQbG90cwoKV2UnbGwgYmVnaW4gYnkgcGxvdHRpbmcgcmVzcG9uc2VzIG9mICJ0aGluayIgKHJlZCkgdnMuICJiZWxpZXZlIiAodHVycXVvaXNlKSB0byBnZXQgYW4gb3ZlcmFsbCBzZW5zZSBvZiBhbnkgcGF0dGVybnMgaW4gdGhlIGRhdGEuCgojIyBCeSBzdXBlcm9yZGluYXRlIGNhdGVnb3J5CgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KZDFfbG9uZyAlPiUKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IHN1cGVyX2NhdCwgCiAgICAgICAgICAgICAjIHB1dCBOQXMgb24gdG9wIG9mIGJhcgogICAgICAgICAgICAgZmlsbCA9IGZhY3RvcihyZXNwb25zZV9jYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoTkEsICJ0aGluayIsICJiZWxpZXZlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlID0gTlVMTCkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeV9uLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGFscGhhID0gMC43LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjEpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJjYXRlZ29yeSIsIHkgPSAicHJvcG9ydGlvbiIsIGZpbGwgPSAicmVzcG9uc2UiKQpgYGAKCiMjIEJ5IGNhdGVnb3J5CgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KZDFfbG9uZyAlPiUKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IGNhdGVnb3J5LCAKICAgICAgICAgICAgICMgcHV0IE5BcyBvbiB0b3Agb2YgYmFyCiAgICAgICAgICAgICBmaWxsID0gZmFjdG9yKHJlc3BvbnNlX2NhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhOQSwgInRoaW5rIiwgImJlbGlldmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPSBOVUxMKSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5X24sIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgYWxwaGEgPSAwLjcsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgbGFicyh4ID0gImNhdGVnb3J5IiwgeSA9ICJwcm9wb3J0aW9uIiwgZmlsbCA9ICJyZXNwb25zZSIpCmBgYAoKIyMgQnkgcXVlc3Rpb24KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpkMV9sb25nICU+JQogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihzdHJfd3JhcChxdWVzdGlvbl90ZXh0X3Nob3J0LCA0MCksIG9yZGVyKSwgCiAgICAgICAgICAgICAjIHB1dCBOQXMgb24gdG9wIG9mIGJhcgogICAgICAgICAgICAgZmlsbCA9IGZhY3RvcihyZXNwb25zZV9jYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoTkEsICJ0aGluayIsICJiZWxpZXZlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlID0gTlVMTCkpKSArCiAgZmFjZXRfZ3JpZChjb3VudHJ5X24gfiBjYXRlZ29yeSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBhbHBoYSA9IDAuNywgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4xKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgcGxvdC5tYXJnaW4gPSAodW5pdChjKDAuMiwgMC4yLCAwLjIsIDEuOCksICJjbSIpKSkgKwogIGxhYnMoeCA9ICJjYXRlZ29yeSIsIHkgPSAicHJvcG9ydGlvbiIsIGZpbGwgPSAicmVzcG9uc2UiKQpgYGAKCgojIEFuYWx5c2lzOiBLVyB3aXRob3V0IGxvb2tpbmcgYXQgcHJlcmVnaXN0cmF0aW9uCgpIZXJlJ3MgaG93IEkgYW5hbHl6ZWQgdGhlIGRhdGEgYmVmb3JlIGxvb2tpbmcgYXQgdGhlIHByZXJlZ2lzdHJhdGlvbi4gSSB0aGluayB0aGVzZSBhbmFseXNlcyBhcmUgdmFsdWFibGUgYmVjYXVzZSB0aGV5J3JlIGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIHByZXJlZ2lzdGVyZWQgYW5hbHlzZXMgLS0gbm8gbmVlZCBmb3IgZm9sbG93LXVwIHRlc3RzIC0tIGFuZCB0aGV5IGRpcmVjdGx5IHRlc3QgdGhlIHF1ZXN0aW9uIG9mIHdoZXRoZXIgdGhlIGVmZmVjdCBvZiBpbnRlcmVzdCB2YXJpZXMgYWNyb3NzIGNvdW50cmllcy9sYW5nYXVnZXMuCgpUZWNobmljYWwgbm90ZTogVW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UsIGFsbCBvZiB0aGVzZSBhbmFseXNlcyB1c2UgImVmZmVjdCBjb2RpbmciIGZvciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgKGUuZy4sIGNvdW50cnksIGNhdGVnb3J5IG9mIHF1ZXN0aW9uKSAtLSBtZWFuaW5nIHRoYXQgZWFjaCBjb3VudHJ5L2xhbmdhdWdlIGlzIGNvbXBhcmVkIHRvIHRoZSAiZ3JhbmQgbWVhbiIgY29sbGFwc2luZyBhY3Jvc3MgYWxsIGNvdW50cmllcy9sYW5ndWFnZXMuIEJlY2F1c2Ugb2YgZGVncmVlcyBvZiBmcmVlZG9tIGlzc3VlcywgZWFjaCBhbmFseXNpcyBvbmx5IGNvbXBhcmVzIDQgb2YgdGhlIDUgY291bnRyaWVzIHRvIHRoZSBncmFuZCBtZWFuIC0tIGJ5IGRlZmF1bHQsIEkndmUgbGVmdCBvdXQgdGhlIGNvbXBhcmlzb24gb2YgdGhlIFVTL0VuZ2xpc2ggdG8gdGhlIGdyYW5kIG1lYW4sIGJ1dCBzdGF0cyBmb3IgdGhhdCBjb21wYXJpc29uIGNvdWxkIGVhc2lseSBiZSBjYWxjdWxhdGVkIChpZiB3ZSBsZWZ0IG91dCBhbm90aGVyIGNvdW50cnkvbGFuZ3VhZ2UgaW5zdGVhZCkuIFRoaXMgaXMganVzdCB0byBzYXkgdGhhdCB5b3Ugd29uJ3Qgc2VlIHN0YXRlbWVudHMgbGlrZSAiVGhlIGVmZmVjdCB3YXMgZXhhZ2dlcmF0ZWQgaW4gdGhlIFVTIHJlbGF0aXZlIHRvIG90aGVyIGNvdW50cmllcywiIGFsdGhvdWdoIHRoZXkgbWlnaHQgYmUgdHJ1ZS4KCiMjIEtXIEFuYWx5c2lzICMxCgpGaXJzdCwgSSB1c2VkIGEgbWl4ZWQgZWZmZWN0cyBsb2dpc3RpYyByZWdyZXNzaW9uIHByZWRpY3RpbmcgaG93IGxpa2VseSBhIHBhcnRpY2lwYW50IHdhcyB0byBjaXJjbGUgImJlbGlldmUiIGJhc2VkIG9uIHRoZSBzdXBlcm9yZGluYXRlIGNhdGVnb3J5IG9mIHRoZSBxdWVzdGlvbiAoInJlbGlnaW91cyIgcXVlc3Rpb25zIG9yICJmYWN0IiBxdWVzdGlvbnMpLCB0aGUgY291bnRyeSB0aGV5IHdlcmUgaW4vbGFuZ3VhZ2UgdGhleSB3ZXJlIHVzaW5nIChVUy9FbmdsaXNoLCBHaGFuYS9GYW50ZSwgVGhhaWxhbmQvVGhhaSwgQ2hpbmEvTWFuZGFyaW4sIG9yIFZhbnVhdHUvQmlzbGFtYSksIGFuZCBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZW0sIHdpdGggYSBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZSAocmFuZG9tIGludGVycGNlcHRzIGFuZCBzbG9wZXMgYnkgc3ViamVjdCwgYW5kIHJhbmRvbSBpbnRlcmNlcHRzIGJ5IHF1ZXN0aW9uKS4gVGhpcyBhbmFseXNpcyBnaXZlcyBtZSBhIHNlbnNlIG9mICgxKSBXaGV0aGVyIHBhcnRpY2lwYW50cyB3ZXJlIG1vcmUgbGlrZWx5IHRvIGNpcmNsZSAiYmVsaWV2ZSIgZm9yIHJlbGlnaW91cyBxdWVzdGlvbnMgdGhhbiBmYWN0IHF1ZXN0aW9ucywgYW5kIHdoZXRoZXIgdGhpcyB0ZW5kZW5jeSB2YXJpZWQgYnkgY291bnRyeS9sYW5ndWFnZSwgY29udHJvbGxpbmcgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIG92ZXJhbGwgcmF0ZXMgb2YgY2lyY2xpbmcgImJlbGlldmUiIG1pZ2h0IHZhcnkgYnkgY291bnRyeS9sYW5ndWFnZSAoYW5kIGFjY291bnRpbmcgZm9yIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMgYW5kIGRpZmZlcmVuY2VzIGFjcm9zcyBpbmRpdmlkdWFsIHF1ZXN0aW9ucykuCgpgYGB7ciwgZWNobyA9IFR9CnIxLjEgPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICogY291bnRyeSAKICAgICAgICAgICAgICsgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICBkYXRhID0gZDFfbG9uZykKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMS4xLCBzdGRfYmV0YSA9IFQpICU+JSByZWd0YWJfc3R5bGVfZnVuKHJvd19lbXBoID0gYygyLCA3OjEwKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CnJlZ3RhYl9yYW5fZnVuKHIxLjEsIHN1YmpfdmFyID0gInRoYjFfc3ViaiIpICU+JSByZWd0YWJfc3R5bGVfZnVuKCkKYGBgCgpUaGUgZWZmZWN0cyBvZiBwcmltYXJ5IGludGVyZXN0IGFyZSBpbiBib2xkOgoKLSAqKkNhdGVnb3J5IChyZWxpZ2lvdXMpKio6IENvbGxhcHNpbmcgYWNyb3NzIGNvdW50cmllcy9sYW5ndWFnZXMsIHBhcnRpY2lwYW50cyB3ZXJlIGluZGVlZCBtb3JlIGxpa2VseSB0byBzYXkgImJlbGlldmUiIGZvciAicmVsaWdpb3VzIiBxdWVzdGlvbnMuIFRoaXMgZWZmZWN0IGlzIG11Y2ggbGFyZ2VyIHRoYW4gYW55IG9mIHRoZSBkaWZmZXJlbmNlcyBhY3Jvc3MgY291bnRyaWVzL2xhbmd1YWdlcyAoYXMgeW91IGNhbiBzZWUgYnkgY29tcGFyaW5nIHRoZSDOsiB2YWx1ZXMgZm9yIGRpZmZlcmVudCBlZmZlY3RzKS4KLSBDb3VudHJ5IChHaC4pOiBQYXJ0aWNpcGFudHMgaW4gR2hhbmEgd2VyZSBnZW5lcmFsbHkgbW9yZSBsaWtlbHkgdGhhbiBvdGhlciBwYXJ0aWNpcGFudHMgdG8gc2F5ICJiZWxpZXZlLCIgY29sbGFwc2luZyBhY3Jvc3MgcXVlc3Rpb24gY2F0ZWdvcmllcy4KLSBDb3VudHJ5IChUaC4pOiBQYXJ0aWNpcGFudHMgaW4gVGhhaWxhbmQgd2VyZSBnZW5lcmFsbHkgbGVzcyBsaWtlbHkgdGhhbiBvdGhlciBwYXJ0aWNpcGFudHMgdG8gc2F5ICJiZWxpZXZlLCIgY29sbGFwc2luZyBhY3Jvc3MgcXVlc3Rpb24gY2F0ZWdvcmllcy4KLSBDb3VudHJ5IChDaC4pOiBQYXJ0aWNpcGFudHMgaW4gQ2hpbmEgd2VyZSBubyBtb3JlIG9yIGxlc3MgbGlrZWx5IHRoYW4gb3RoZXIgcGFydGljaXBhbnRzIHRvIHNheSAiYmVsaWV2ZSwiIGNvbGxhcHNpbmcgYWNyb3NzIHF1ZXN0aW9uIGNhdGVnb3JpZXMuCi0gQ291bnRyeSAoVnQuKTogUGFydGljaXBhbnRzIGluIFZhbnVhdHUgd2VyZSBubyBtb3JlIG9yIGxlc3MgbGlrZWx5IHRoYW4gb3RoZXIgcGFydGljaXBhbnRzIHRvIHNheSAiYmVsaWV2ZSwiIGNvbGxhcHNpbmcgYWNyb3NzIHF1ZXN0aW9uIGNhdGVnb3JpZXMuCi0gKipDYXRlZ29yeSAocmVsaWdpb3VzKSB4IENvdW50cnkgKEdoLikqKjogVGhlIGRpZmZlcmVuY2UgaW4gcmF0ZXMgb2YgImJlbGlldmUiIHJlc3BvbnNlcyBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIHNtYWxsZXIgaW4gR2hhbmEgdGhhbiBpbiBvdGhlciBjb3VudHJpZXMuCi0gKipDYXRlZ29yeSAocmVsaWdpb3VzKSB4IENvdW50cnkgKFRoLikqKjogVGhlIGRpZmZlcmVuY2UgaW4gcmF0ZXMgb2YgImJlbGlldmUiIHJlc3BvbnNlcyBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIGxhcmdlciBpbiBUaGFpbGFuZCB0aGFuIGluIG90aGVyIGNvdW50cmllcy4KLSAqKkNhdGVnb3J5IChyZWxpZ2lvdXMpIHggQ291bnRyeSAoQ2guKSoqOiBUaGUgZGlmZmVyZW5jZSBpbiByYXRlcyBvZiAiYmVsaWV2ZSIgcmVzcG9uc2VzIGJldHdlZW4gcXVlc3Rpb24gY2F0ZWdvcmllcyB3YXMgbm8gc21hbGxlciBvciBsYXJnZXIgaW4gQ2hpbmEgdGhhbiBpbiBvdGhlciBjb3VudHJpZXMuCi0gKipDYXRlZ29yeSAocmVsaWdpb3VzKSB4IENvdW50cnkgKFZ0LikqKjogVGhlIGRpZmZlcmVuY2UgaW4gcmF0ZXMgb2YgImJlbGlldmUiIHJlc3BvbnNlcyBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIG5vIHNtYWxsZXIgb3IgbGFyZ2VyIGluIFZhbnVhdHUgdGhhbiBpbiBvdGhlciBjb3VudHJpZXMuCgoqKlRha2UtYXdheTogVGhlIHByZWRpY3RlZCBlZmZlY3QgaXMgZXZpZGVudCBpbiB0aGlzIGRhdGFzZXQuIEl0IGFwcGVhcnMgdG8gYmUgZXhhZ2dlcmF0ZWQgaW4gVGhhaWxhbmQgYW5kIGRpbWluaXNoZWQgaW4gR2hhbmEuKioKCiMjIEtXIEFuYWx5c2VzICMxYS0xZSAoYnkgY291bnRyeSkKCk5leHQsIEkgZGlkIHRoaXMgc2FtZSBhbmFseXNpcyB3aXRoaW4gZWFjaCBjb3VudHJ5L2xhbmdhdWdlIGFsb25lICh1c2luZyB0aGUgbW9zdCBtYXhpbWFsIHJhbmRvbSBlZmZlY3Qgc3RydWN0dXJlIHRoYXQgY29udmVyZ2VkIGFjcm9zcyBhbGwgY291bnRyaWVzL2xhbmd1YWdlcykuIAoKYGBge3IsIGVjaG8gPSBUfQojIG5vdGU6IHVzaW5nIG1vc3QgbWF4aW1hbCBjb21tb24gcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlCnIxLjFfdXMgPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICsgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksIAogICAgICAgICAgICAgICAgICAjICgxICsgc3VwZXJfY2F0IHx8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgIyBmYWlsZWQgdG8gY29udmVyZ2UKICAgICAgICAgICAgICAgICAgKDEgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAjICgxICsgc3VwZXJfY2F0IHwgdGhiMV9zdWJqKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBkMV9sb25nICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVVMiKSkKCnIxLjFfZ2ggPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICsgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgICAgICAoMSB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopLAogICAgICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpKQoKcjEuMV90aCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKyAKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgICAgICAoMSB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopLAogICAgICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJUaGFpbGFuZCIpKQoKcjEuMV9jaCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKyAKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgCiAgICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgICAgICAoMSB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgICAgICMgKDEgKyBzdXBlcl9jYXQgfCB0aGIxX3N1YmopLAogICAgICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpKQoKcjEuMV92dCA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKyAKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwgIyBmYWlsZWQgdG8gY29udmVyZ2UKICAgICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8fCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksCiAgICAgICAgICAgICAgICAgICgxIHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgICAgIyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaiksCiAgICAgICAgICAgICAgICBkYXRhID0gZDFfbG9uZyAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlZhbnVhdHUiKSkKYGBgCgpgYGB7cn0KYmluZF9yb3dzKHJlZ3RhYl9mdW4ocjEuMV91cykgJT4lIG11dGF0ZShDb3VudHJ5ID0gIlVTIiksCiAgICAgICAgICByZWd0YWJfZnVuKHIxLjFfZ2gpICU+JSBtdXRhdGUoQ291bnRyeSA9ICJHaGFuYSIpLAogICAgICAgICAgcmVndGFiX2Z1bihyMS4xX3RoKSAlPiUgbXV0YXRlKENvdW50cnkgPSAiVGhhaWxhbmQiKSwKICAgICAgICAgIHJlZ3RhYl9mdW4ocjEuMV9jaCkgJT4lIG11dGF0ZShDb3VudHJ5ID0gIkNoaW5hIiksCiAgICAgICAgICByZWd0YWJfZnVuKHIxLjFfdnQpICU+JSBtdXRhdGUoQ291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIHNlbGVjdChDb3VudHJ5LCBldmVyeXRoaW5nKCkpICU+JQogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBzZXEoMiwgMTAsIDIpKSAlPiUKICBjb2xsYXBzZV9yb3dzKDEpCmBgYAoKVGhlIGVmZmVjdHMgb2YgcHJpbWFyeSBpbnRlcmVzdCBhcmUgaW4gYm9sZCwgYW5kICoqdGhlIHRha2UtYXdheSBpcyBjbGVhcjogSW4gZXZlcnkgY291bnRyeS9sYW5ndWFnZSwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gc2F5ICJiZWxpZXZlIiBpbiAicmVsaWdpb3VzIiBxdWVzdGlvbnMgdGhhbiBpbiAiZmFjdCIgcXVlc3Rpb25zKiouCgoKIyMgS1cgQW5hbHlzaXMgIzIKCkluIHRoaXMgYW5hbHlzaXMsIEkgdHJlYXRlZCBjb3VudHJ5L2xhbmd1YWdlIGFzIGEgcmFuZG9tIHJhdGhlciB0aGFuIGZpeGVkIGVmZmVjdCAod2l0aCBwYXJ0aWNpcGFudHMgbmVzdGVkIHdpdGhpbiBjb3VudHJpZXMpLiAoTm90ZSB0aGF0IEkgaGFkIHRvIHVzZSBhIHNpbXBsZXIgcmFuZG9tIGVmZmVjdHMgc3RydWN0dXJlIGluIG9yZGVyIHRvIGdldCB0aGUgbW9kZWwgdG8gY29udmVyZ2UuKQoKYGBge3IsIGVjaG8gPSBUfQpyMS4yIDwtIGxtZXIoYmVsaWV2ZSB+IHN1cGVyX2NhdCAKICAgICAgICAgICAgICMgKyAoMSArIHN1cGVyX2NhdCB8IGNvdW50cnkvdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgIyArICgxICsgc3VwZXJfY2F0IHx8IGNvdW50cnkvdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgIyArICgxICsgc3VwZXJfY2F0IHwgY291bnRyeS90aGIxX3N1YmopLCAjIGZhaWxlZCB0byBjb252ZXJnZQogICAgICAgICAgICAgKyAoMSB8IGNvdW50cnkvdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcpCmBgYAoKYGBge3J9CnJlZ3RhYl9mdW4ocjEuMikgJT4lIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSAyKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KcmVndGFiX3Jhbl9mdW4ocjEuMiwgc3Vial92YXIgPSAidGhiMV9zdWJqIikgJT4lIHJlZ3RhYl9zdHlsZV9mdW4oKQpgYGAKClRoZSBlZmZlY3Qgc3RpbGwgaG9sZHMuCgojIyBLVyBBbmFseXNpcyAjMwoKRmluYWxseSwgSSByYW4gYSB2ZXJzaW9uIG9mIHRoaXMgZmlyc3QgbW9kZWwgbG9va2luZyBhdCA1IGNhdGVnb3JpZXMgb2YgcXVlc3Rpb25zIChyYXRoZXIgdGhhbiAyIHN1cGVyb3JkaW5hdGUgY2F0ZWdvcmllcyk6IENocmlzdGlhbiByZWxpZ2lvdXMsIEJ1ZGRoaXN0IHJlbGlnaW91cywgd2VsbC1rbm93biBmYWN0LCBlc290ZXJpYyBmYWN0LCBhbmQgcGVyc29uYWwgZmFjdC4gSSBjb21wYXJlZCB0aGVzZSBjYXRlZ29yaWVzIHVzaW5nIHBsYW5uZWQgb3J0aG9nb25hbCBjb250cmFzdHMuCgpgYGB7ciwgZWNobyA9IFR9CnIxLjMgPC0gbG1lcihiZWxpZXZlIH4gY2F0ZWdvcnkgKiBjb3VudHJ5IAogICAgICAgICAgICAgIyArICgxICsgY2F0ZWdvcnkgfCB0aGIxX3N1YmopICsgKDEgfCBxdWVzdGlvbiksICMgZmFpbGVkIHRvIGNvbnZlcmdlCiAgICAgICAgICAgICArICgxICsgY2F0ZWdvcnkgfHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgIyArICgxICsgY2F0ZWdvcnkgfCB0aGIxX3N1YmopLCAKICAgICAgICAgICAgICMgKyAoMSArIGNhdGVnb3J5IHx8IHRoYjFfc3ViaiksIAogICAgICAgICAgICAgIyArICgxIHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcpCmBgYAoKYGBge3J9CnJlZ3RhYl9mdW4ocjEuMywgCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjEgPSAiY2F0ZWdvcnlfcmVsaWdfZmFjdCIsIAogICAgICAgICAgIHByZWRpY3Rvcl9uYW1lMSA9ICJDYXRlZ29yeSAoUmVsaWdpb3VzIHZzLiBmYWN0KSIsCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjIgPSAiY2F0ZWdvcnlfcmVsaWdfQ19CIiwKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTIgPSAiQ2F0ZWdvcnkgKENocmlzdGlhbiB2cy4gQnVkZGhpc3QgcmVsaWdpb3VzKSIsCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjMgPSAiY2F0ZWdvcnlfZmFjdF9XRV9MIiwKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTMgPSAiQ2F0ZWdvcnkgKHdlbGwta25vd24gJiBlc290ZXJpYyB2cy4gcGVyc29uYWwgZmFjdCkiLAogICAgICAgICAgIHByZWRpY3Rvcl92YXI0ID0gImNhdGVnb3J5X2ZhY3RfV19FIiwKICAgICAgICAgICBwcmVkaWN0b3JfbmFtZTQgPSAiQ2F0ZWdvcnkgKHdlbGwta25vd24gdnMuIGVzb3RlcmljIGZhY3QpIikgJT4lIAogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBjKDI6NSwgMTA6MjUpKSAlPiUKICBncm91cF9yb3dzKCJJbnRlcmNlcHQiLCBzdGFydF9yb3cgPSAxLCBlbmRfcm93ID0gMSkgJT4lCiAgZ3JvdXBfcm93cygiQ2F0ZWdvcnkgY29tcGFyaXNvbnMiLCBzdGFydF9yb3cgPSAyLCBlbmRfcm93ID0gNSkgJT4lCiAgZ3JvdXBfcm93cygiQ291bnRyeSBjb21wYXJpc29ucyIsIHN0YXJ0X3JvdyA9IDYsIGVuZF9yb3cgPSA5KSAlPiUKICBncm91cF9yb3dzKCJJbnRlcmFjdGlvbnM6IEdoYW5hIiwgc3RhcnRfcm93ID0gMTAsIGVuZF9yb3cgPSAxMykgJT4lCiAgZ3JvdXBfcm93cygiSW50ZXJhY3Rpb25zOiBUaGFpbGFuZCIsIHN0YXJ0X3JvdyA9IDE0LCBlbmRfcm93ID0gMTcpICU+JQogIGdyb3VwX3Jvd3MoIkludGVyYWN0aW9uczogQ2hpbmEiLCBzdGFydF9yb3cgPSAxOCwgZW5kX3JvdyA9IDIxKSAlPiUKICBncm91cF9yb3dzKCJJbnRlcmFjdGlvbnM6IFZhbnVhdHUiLCBzdGFydF9yb3cgPSAyMiwgZW5kX3JvdyA9IDI1KQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KcmVndGFiX3Jhbl9mdW4ocjEuMywgc3Vial92YXIgPSAidGhiMV9zdWJqIikgJT4lIHJlZ3RhYl9zdHlsZV9mdW4oKQpgYGAKClRoZSBmaXJzdCBvcnRob2dvbmFsIGNvbnRyYXN0IGNvbXBhcmVkIHRoZSB0d28gInJlbGlnaW91cyIgY2F0ZWdvcmllcyB0byB0aGUgdGhyZWUgImZhY3QiIGNhdGVnb3JpZXMgKCJDYXRlZ29yeSAoUmVsaWdvaXVzIHZzLiBmYWN0KSIpLiBUaGlzIHBhcmFsbGVscyB0aGUgcHJldmlvdXMgYW5hbHlzZXMsIGFuZCB0aGUgcmVzdWx0cyBhcmUgc2ltaWxhcjogT3ZlcmFsbCwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3IgcmVsaWdpb3VzIHF1ZXN0aW9ucyB0aGFuIGZhY3QgcXVlc3Rpb25zLCBhbmQgdGhpcyB0ZW5kZW5jeSB3YXMgZGltaW5pc2hlZCBpbiBHaGFuYSBhbmQgZXhhZ2dlcmF0ZWQgaW4gVGhhaWxhbmQuCgpUaGUgc2Vjb25kIG9ydGhvZ29uYWwgY29udHJhc3QgY29tcGFyZWQgQ2hyaXN0aWFuIHRvIEJ1ZGRoaXN0ICJyZWxpZ2lvdXMiIHF1ZXN0aW9ucy4gT3ZlcmFsbCwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3IgQ2hyaXN0aWFuIHF1ZXN0aW9ucywgYW5kIHRoaXMgdGVuZGVuY3kgd2FzIGV4YWdnZXJhdGVkIGluIEdoYW5hIGFuZCBWYW51YXR1ICh3aGljaCB3ZXJlIHByZWRvbWluYW50bHkgQ2hyaXN0aWFuIHNhbXBsZXMpIGFuZCBkaW1pbmlzaGVkIGluIFRoYWlsYW5kIGFuZCBDaGluYSAod2hpY2ggd2VyZSBtb3JlIEJ1ZGRoaXN0IHNhbXBsZXMpLgoKVGhlIHRoaXJkIG9ydGhvZ29uYWwgY29udHJhc3QgY29tcGFyZWQgd2VsbC1rbm93biBhbmQgZXNvdGVyaWMgZmFjdHMsIG9uIHRoZSBvbmUgaGFuZCwgdG8gcGVyc29uYWwgZmFjdHMsIG9uIHRoZSBvdGhlci4gT3ZlcmFsbCwgcGFydGljaXBhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3Igd2VsbC1rbm93biBhbmQgZXNvdGVyaWMgZmFjdHMsIGFuZCB0aGlzIHRlbmRlbmN5IHdhcyBkaW1pbmlzaGVkIGluIEdoYW5hIGFuZCBDaGluYSwgYW5kIGV4YWdnZXJhdGVkIGluIFRoYWlsYW5kIGFuZCBWYW51YXR1LgoKVGhlIGZvdXJ0aCBvcnRob2dvbmFsIGNvbnRyYXN0IGNvbXBhcmVkIHdlbGwta25vd24gdG8gZXNvdGVyaWMgZmFjdHMuIE92ZXJhbGwsIHBhcnRpY3BhbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gY2lyY2xlICJiZWxpZXZlIiBmb3Igd2VsbC1rbm93biBmYWN0cnMsIGFuZCB0aGVuIHRlbmRlbmN5IHdhcyBkaW1pbmlzaGVkIGluIENoaW5hLCBhbmQgZXhhZ2dlcmF0ZWQgaW4gVmFudWF0dS4KCk5vdGUgdGhhdCB0aGVzZSBmaW5kaW5ncyBzdGF0aXN0aWNhbGx5IGNvbnRyb2wgZm9yIGRpZmZlcmVuY2VzIGFjcm9zcyBzYW1wbGVzIGluIHRoZSBvdmVyYWxsIHJhdGUgb2YgY2lyY2xpbmcgImJlbGlldmUiICh3aGljaCB3YXMgZ2VuZXJhbGx5IGhpZ2hlciBpbiBHaGFuYSBhbmQgbG93ZXIgaW4gVGhhaWxhbmQpLgoKCiMgQW5hbHlzaXM6IEJhc2VkIG9uIHByZXJlZ2lzdHJhdGlvbgoKRnJvbSBwcmVyZWdpc3RyYXRpb246Cgo+ICJTdXJ2ZXkgMTogV2Ugd2lsbCBjb25kdWN0IGEgNSAoU2l0ZTogQ2hpbmEgdnMuIFRoYWlsYW5kIHZzLiBWYW51YXR1IHZzLiBHaGFuYSB2cy4gVW5pdGVkIFN0YXRlcykgeCAyIChTdGF0ZW1lbnQgVHlwZTogcmVsaWdpb24gdnMuIGZhY3QpIG1peGVkIEFOT1ZBIHdpdGggcmVwZWF0ZWQgbWVhc3VyZXMgb24gdGhlIHNlY29uZCBmYWN0b3IgYW5kIHRoZSBwcm9wb3J0aW9uIG9mIHRyaWFscyBvbiB3aGljaCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHNlbnRlbmNlcyB1c2luZyBhIGZvcm0gdGhlIHdvcmQg4oCcYmVsaWV2ZeKAnSAob3IgaXRzIHJlc3BlY3RpdmUgdHJhbnNsYXRpb24pIGFzIHRoZSBkZXBlbmRlbnQgbWVhc3VyZS4gVG8gbG9vayBmb3IgZmluZXItZ3JhaW5lZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpZmZlcmVudCByZWxpZ2lvdXMgYW5kIGZhY3R1YWwgc3RhdGVtZW50cywgd2Ugd2lsbCBhbHNvIGNvbmR1Y3QgYSA1IChTaXRlOiBDaGluYSB2cy4gVGhhaWxhbmQgdnMuIFZhbnVhdHUgdnMuIEdoYW5hIHZzLiBVbml0ZWQgU3RhdGVzKSB4IDUgKFN0YXRlbWVudCBUeXBlOiBCdWRkaGlzdCByZWxpZ2lvdXMgc3RhdGVtZW50cyB2cy4gQ2hyaXN0aWFuIHJlbGlnaW91cyBzdGF0ZW1lbnRzIHZzLiBsaWZlIGZhY3RzIHZzLiB3ZWxsLWtub3duIGZhY3RzIHZzLiBlc290ZXJpYyBmYWN0cykgbWl4ZWQgQU5PVkEgd2l0aCByZXBlYXRlZCBtZWFzdXJlcyBvbiB0aGUgc2Vjb25kIGZhY3RvciBhbmQgdGhlIHByb3BvcnRpb24gb2YgdHJpYWxzIG9uIHdoaWNoIHBhcnRpY2lwYW50cyBjb21wbGV0ZWQgc2VudGVuY2VzIHVzaW5nIGEgZm9ybSBvZiB0aGUgd29yZCDigJxiZWxpZXZl4oCdIChvciBpdHMgcmVzcGVjdGl2ZSB0cmFuc2xhdGlvbikgYXMgdGhlIGRlcGVuZGVudCBtZWFzdXJlLiBJbiBhbGwgY2FzZXMgd2hlcmUgb21uaWJ1cyBBTk9WQXMgYXJlIHNpZ25pZmljYW50LCB3ZSB3aWxsIGNvbmR1Y3QgcGFpcndpc2UgYW5hbHlzZXMgY29tcGFyaW5nIGVhY2ggc3RhdGVtZW50IHR5cGUgd2l0aCBlYWNoIG90aGVyIHN0YXRlbWVudCB0eXBlIGFuZCBlYWNoIHNpdGUgd2l0aCBlYWNoIG90aGVyIHNpdGUuIgoKYGBge3IsIGVjaG8gPSBUfQpkMV9hbm92YSA8LSBkMV9sb25nICU+JQogIGRpc3RpbmN0KHRoYjFfc3ViaiwgY291bnRyeSwgc3VwZXJfY2F0LCBxdWVzdGlvbiwgYmVsaWV2ZSkgJT4lCiAgZ3JvdXBfYnkodGhiMV9zdWJqLCBjb3VudHJ5LCBzdXBlcl9jYXQpICU+JQogIHN1bW1hcmlzZShwcm9wX2JlbGlldmUgPSBtZWFuKGJlbGlldmUpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRoYjFfc3ViaiA9IGZhY3Rvcih0aGIxX3N1YmopKQoKY29udHJhc3RzKGQxX2Fub3ZhJGNvdW50cnkpIDwtIGNvbnRyYXN0X2NvdW50cnkKY29udHJhc3RzKGQxX2Fub3ZhJHN1cGVyX2NhdCkgPC0gY29udHJhc3Rfc3VwZXJfY2F0CmBgYAoKIyMgUHJlcmVnIEFuYWx5c2lzICMxCgpIZXJlIGlzIHRoZSBmaXJzdCBwcmVyZWdpc3RlcmVkIGFuYWx5aXM6IGEgNSAoY291bnRyeSkgeCAyIChxdWVzdGlvbiBjYXRlZ29yeSkgbWl4ZWQgQU5PVkEgd2l0aCByZXBlYXRlZCBtZWFzdXJlcyBvbiB0aGUgc2Vjb25kIGZhY3RvciBhbmQgdGhlIHByb3BvcnRpb24gb2YgdHJpYWxzIG9uIHdoaWNoIHBhcnRpY2lwYW50cyBjaXJjbGVkICJiZXJsaWV2ZSIgYXMgdGhlIERWLgoKYGBge3IsIGVjaG8gPSBUfQpyMS40IDwtIGQxX2Fub3ZhICU+JQogIGFub3ZhX3Rlc3QoZHYgPSBwcm9wX2JlbGlldmUsIAogICAgICAgICAgICAgd2lkID0gdGhiMV9zdWJqLCAKICAgICAgICAgICAgIGJldHdlZW4gPSBjb3VudHJ5LCAKICAgICAgICAgICAgIHdpdGhpbiA9IHN1cGVyX2NhdCkKCmdldF9hbm92YV90YWJsZShyMS40KQpgYGAKClRoaXMgYW5hbHlzaXMgYWxpZ25zIHdpdGggdGhlIHJlZ3Jlc3Npb25zIGFib3ZlLCBzdWdnZXN0aW5nIHRoYXQgcGFydGljaXBhbnRzJyB0ZW5kZW5jeSB0byBjaXJjbGUgImJlbGlldmUiIHZhcmllZCBieSBjb3VudHJ5L2xhbmd1YWdlIChgY291bnRyeWApIGFuZCBieSBxdWVzdGlvbiBjYXRlZ29yeSAoYHN1cGVyX2NhdGApLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBxdWVzdGlvbiBjYXRlZ29yeSB2YXJpZWQgYWNyb3NzIGNvdW50cmllcy9sYW5ndWFnZXMgKGkuZS4sIHRoZXJlIHdhcyBhbiBpbnRlcmFjdGlvbjogYGNvdW50cnk6c3VwZXJfY2F0YCkuCgpUaGUgcHJlcmVnaXN0cmF0aW9uIGluZGljYXRlZCB0aGF0IHdlJ2QgY29uZHVjdCBwYWlyd2lzZSBmb2xsb3ctdXAgYW5hbHlzZXMgY29tcGFyaW5nIHRoZSB0d28gcXVlc3Rpb24gY2F0ZWdvcmllcyBhbmQgY29tcGFyaW5nIHBhaXJzIG9mIGNvdW50aXJlcy9sYW5ndWFnZXMgLS0gYnV0IEkgZG9uJ3QgcmVhbGx5IHRoaW5rIHdlJ3JlIGludGVyZXN0ZWQgaW4gY29tcGFyaW5nIHBhaXJzIG9mIGNvdW50cmllcy9sYW5ndWFnZXMsIHNvIEknbSBnb2luZyB0byBza2lwIHRoYXQgZm9yIG5vdy4gSW5zdGVhZCwgSSdsbCBjb21wYXJlIHRoZSB0d28gcXVlc3Rpb25zIGNhdGVnb3JpZXMgd2l0aGluIGVhY2ggY291bnRyeS9sYW5ndWFnZSAodG8gZXhwbG9yZSB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24pLgoKSGVyZSB3ZSBnbzoKCiMjIyBDb21wYXJpbmcgcXVlc3Rpb24gY2F0ZWdvcmllcwoKYGBge3IsIGVjaG8gPSBUfQpyMS41YSA8LSB0LnRlc3QocHJvcF9iZWxpZXZlIH4gc3VwZXJfY2F0LCBwYWlyZWQgPSBULCBkMV9hbm92YSk7IHIxLjVhCmBgYAoKQ29sbGFwc2luZyBhY3Jvc3MgY291bnRyaWVzL2xhbmd1YWdlcywgKipwYXJ0aWNpcGFudHMgY2lyY2xlZCBzaWduaWZpY2FudGx5IG1vcmUgImJlbGlldmUiIHJlc3BvbnNlcyBmb3IgcXVlc3Rpb25zIGluIHRoZSByZWxpZ2lvdXMgY2F0ZWdvcnkgKGByIDEwMCAqIChyMS41YSRlc3RpbWF0ZVsxXSAlPiUgcm91bmQoMikpYCUpIHRoYW4gdGhleSBkaWQgZm9yIHF1ZXN0aW9ucyBpbiB0aGUgZmFjdCBjYXRlZ29yeSAoYHIgMTAwICogKHIxLjVhJGVzdGltYXRlWzJdICU+JSByb3VuZCgyKSlgJSkqKi4KCiMjIyBDb21wYXJpbmcgcXVlc3Rpb24gY2F0ZWdvcmllcyB3aXRoaW4gY291bnRyaWVzL2xhbmd1YWdlcwoKYGBge3IsIGVjaG8gPSBUfQojIFVTCnIxLjViX3VzIDwtIHQudGVzdChwcm9wX2JlbGlldmUgfiBzdXBlcl9jYXQsIHBhaXJlZCA9IFQsCiAgICAgICAgICAgICAgICAgICBkMV9hbm92YSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlVTIikpOyByMS41Yl91cwoKIyBHaGFuYQpyMS41Yl9naCA8LSB0LnRlc3QocHJvcF9iZWxpZXZlIH4gc3VwZXJfY2F0LCBwYWlyZWQgPSBULAogICAgICAgICAgICAgICAgICAgZDFfYW5vdmEgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJHaGFuYSIpKTsgcjEuNWJfZ2gKCiMgVGhhaWxhbmQKcjEuNWJfdGggPC0gdC50ZXN0KHByb3BfYmVsaWV2ZSB+IHN1cGVyX2NhdCwgcGFpcmVkID0gVCwKICAgICAgICAgICAgICAgICAgIGQxX2Fub3ZhICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSk7IHIxLjViX3RoCgojIENoaW5hCnIxLjViX2NoIDwtIHQudGVzdChwcm9wX2JlbGlldmUgfiBzdXBlcl9jYXQsIHBhaXJlZCA9IFQsCiAgICAgICAgICAgICAgICAgICBkMV9hbm92YSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikpOyByMS41Yl9jaAoKIyBWYW51YXR1CnIxLjViX3Z0IDwtIHQudGVzdChwcm9wX2JlbGlldmUgfiBzdXBlcl9jYXQsIHBhaXJlZCA9IFQsCiAgICAgICAgICAgICAgICAgICBkMV9hbm92YSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlZhbnVhdHUiKSk7IHIxLjViX3Z0CmBgYAoKKipUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHF1ZXN0aW9uIGNhdGVnb3JpZXMgd2FzIHNpZ25pZmljYW50IGluIGVhY2ggY291bnRyeS9sYW5ndWFnZSBjb25zaWRlcmVkIGFsb25lLioqCgoKIyBBbmFseXNpczogUmVsaWdpb24gYW5kIHJlbGlnaW9zaXR5CgojIyBEZW1vZ3JhcGhpY3MKCkZpcnN0LCBsZXQncyBqdXN0IGxvb2sgYXQgaG93IHBlb3BsZSBpbiBkaWZmZXJlbnQgY291bnRyaWVzIHJlcGxpZWQgdG8gdGhlIHJlbGV2YW50IHF1ZXN0aW9ucy4gCgojIyMgYHRoYjFfZGVtb19yZWdwYDogIkFyZSB5b3UgYSBwYXJ0IG9mIGFueSByZWxpZ2lvdXMgZ3JvdXA/IgoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IGNvdW50cnlfbiwgCiAgICAgICAgICAgICAjIHB1dCBOQXMgb24gdG9wIG9mIGJhcgogICAgICAgICAgICAgZmlsbCA9IGZhY3Rvcih0aGIxX2RlbW9fcmVncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhOQSwgIk5PIiwgIllFUyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZSA9IE5VTEwpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgbGFicyh4ID0gImNvdW50cnkiLCB5ID0gInByb3BvcnRpb24iLCAKICAgICAgIGZpbGwgPSAiQXJlIHlvdSBhIHBhcnQgb2YgYW55IHJlbGlnaW91cyBncm91cD8iKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKIyMjIGB0aGIxX2RlbW9fcmVncF8xX1RFWFRgOiAiQXJlIHlvdSBhIHBhcnQgb2YgYW55IHJlbGlnaW91cyBncm91cD8gSWYgeWVzLCB3aGF0IGdyb3VwPyIKCmBgYHtyfQpkMSAlPiUgCiAgbGVmdF9qb2luKHNhbXBsZV9zaXplX2QxKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5X24sIAogICAgICAgICAgICAgIyBwdXQgTkFzIG9uIHRvcCBvZiBiYXIKICAgICAgICAgICAgIGZpbGwgPSBmYWN0b3IocmVsaWdpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoTkEsICJPdGhlciIsICJDaHJpc3RpYW4iLCAiQnVkZGhpc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZSA9IE5VTEwpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgbGFicyh4ID0gImNvdW50cnkiLCB5ID0gInByb3BvcnRpb24iLCAKICAgICAgIGZpbGwgPSAiLi4uSWYgeWVzLCB3aGF0IGdyb3VwPyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgojIyMgYHRoYjFfZGVtb19yZWx5YDogIkZyb20gMSB0byA3LCBob3cgcmVsaWdpb3VzIGFyZSB5b3U/ICgxID0gbm90IHJlbGlnaW91cyBhdCBhbGwsIDcgPQpleHRyZW1lbHkgcmVsaWdpb3VzKSIKClNlZW1zIHRvIGhhdmUgYmVlbiBvbWl0dGVkIGluIFRoYWlsYW5kPwoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IGFzLm51bWVyaWModGhiMV9kZW1vX3JlbHkpKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5X24pICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMTo3LCBtaW5vcl9icmVha3MgPSBOVUxMKSArCiAgbGFicyh4ID0gIkZyb20gMSB0byA3LCBob3cgcmVsaWdpb3VzIGFyZSB5b3U/IiwgCiAgICAgICB5ID0gImNvdW50IikKYGBgCgojIyMgYHRoYjFfZGVtb19pbXByYDogIkZyb20gMSB0byA3LCBob3cgaW1wb3J0YW50IHRvIHlvdSBpcyB5b3VyIHJlbGlnaW91cyBwcmFjdGljZT8gICgxID0gbm90IGltcG9ydGFudCBhdCBhbGwsIDcgPSBvZiB1dG1vc3QgaW1wb3J0YW5jZSkiCgpTZWVtcyB0byBoYXZlIGJlZW4gb21pdHRlZCBpbiBUaGFpbGFuZD8KCmBgYHtyfQpkMSAlPiUgCiAgbGVmdF9qb2luKHNhbXBsZV9zaXplX2QxKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5udW1lcmljKHRoYjFfZGVtb19pbXByKSkpICsKICBmYWNldF9ncmlkKH4gY291bnRyeV9uKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6NywgbWlub3JfYnJlYWtzID0gTlVMTCkgKwogIGxhYnMoeCA9ICJGcm9tIDEgdG8gNywgaG93IGltcG9ydGFudCB0byB5b3UgaXMgeW91ciByZWxpZ2lvdXMgcHJhY3RpY2U/IiwgCiAgICAgICB5ID0gImNvdW50IikKYGBgCgojIyMgYHRoYjFfZGVtb193b3JzYDogIkhvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIHBsYWNlcyBvZiB3b3JzaGlwPyIKCmBgYHtyfQpkMSAlPiUgCiAgbGVmdF9qb2luKHNhbXBsZV9zaXplX2QxKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aGIxX2RlbW9fd29ycykpICsKICBmYWNldF9ncmlkKH4gY291bnRyeV9uKSArCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh4ID0gIkhvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIHBsYWNlcyBvZiB3b3JzaGlwPyIsIAogICAgICAgeSA9ICJjb3VudCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKIyMjIGB0aGIxX2RlbW9fYmdvZGA6ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgbGV2ZWwgb2YgYmVsaWVmIGluIEdvZD8iCgpgYGB7cn0KZDEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX2Jnb2QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnlfbikgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJXaGF0IGJlc3QgZGVzY3JpYmVzIHlvdXIgbGV2ZWwgb2YgYmVsaWVmIGluIEdvZD8iLCAKICAgICAgIHkgPSAiY291bnQiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCiMjIyBgdGhiMV9kZW1vX2JidWhgOiAiV2hhdCBiZXN0IGRlc2NyaWJlcyB5b3VyIGxldmVsIG9mIGJlbGllZiBpbiBCdWRkaGE/IgoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb19iYnVoKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5X24pICsKICBnZW9tX2JhcigpICsKICBsYWJzKHggPSAiV2hhdCBiZXN0IGRlc2NyaWJlcyB5b3VyIGxldmVsIG9mIGJlbGllZiBpbiBCdWRkaGE/IiwgCiAgICAgICB5ID0gImNvdW50IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgojIyMgYHRoYjFfZGVtb19ib3NwYDogIldoYXQgYmVzdCBkZXNjcmliZXMgeW91ciBsZXZlbCBvZiBiZWxpZWYgaW4gYW5vdGhlciBzcGlyaXR1YWwgYmVpbmcgKG90aGVyIHRoYW4gR29kIG9yIEJ1ZGRoYSk/IgoKYGBge3J9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb19ib3NwKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5X24pICsKICBnZW9tX2JhcigpICsKICBsYWJzKHggPSAiV2hhdCBiZXN0IGRlc2NyaWJlcyB5b3VyIGxldmVsIG9mIGJlbGllZiBpbiBhbm90aGVyIHNwaXJpdHVhbCBiZWluZyAob3RoZXIgdGhhbiBHb2Qgb3IgQnVkZGhhKT8iLCAKICAgICAgIHkgPSAiY291bnQiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCiMjIyBgdGhiMV9kZW1vX2F0c25gOiAiV2hhdCBiZXN0IGRlc2NyaWJlcyB5b3VyIGF0dGl0dWRlIHRvd2FyZHMgdGhlIHN1cGVybmF0dXJhbD8KCmBgYHtyLCBmaWcud2lkdGggPSAzLjUsIGZpZy5hc3AgPSAwLjh9CmQxICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX3NpemVfZDEpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb19hdHNuKSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5X24pICsKICBnZW9tX2JhcigpICsKICBsYWJzKHggPSAiV2hhdCBiZXN0IGRlc2NyaWJlcyB5b3VyIGF0dGl0dWRlIHRvd2FyZHMgdGhlIHN1cGVybmF0dXJhbD8iLCAKICAgICAgIHkgPSAiY291bnQiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpgYGAKCiMjIyBgdGhiMV9kZW1vX2ltc25gOiAiRnJvbSAxIHRvIDcsIGhvdyBpbXBvcnRhbnQgdG8geW91IGlzIHlvdXIgYXR0aXR1ZGUgdG93YXJkIHRoZSBzdXBlcm5hdHVyYWw/ICgxID0gbm90IGltcG9ydGFudCBhdCBhbGwsIDcgPSBvZiB1dG1vc3QgaW1wb3J0YW5jZSkiCgpgYGB7cn0KZDEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfc2l6ZV9kMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXMubnVtZXJpYyh0aGIxX2RlbW9faW1zbikpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnlfbikgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjcsIG1pbm9yX2JyZWFrcyA9IE5VTEwpICsKICBsYWJzKHggPSAiRnJvbSAxIHRvIDcsIGhvdyBpbXBvcnRhbnQgdG8geW91IGlzIHlvdXIgYXR0aXR1ZGUgdG93YXJkIHRoZSBzdXBlcm5hdHVyYWw/IiwgCiAgICAgICB5ID0gImNvdW50IikKYGBgCgojIyBBbmFseXNlcwoKTm93LCBsZXQncyBsb29rIGF0IGhvdyByZXNwb25zZXMgdG8gb3VyIHRoaW5rL2JlbGlldmUgcXVlc3Rpb25zIG1pZ2h0IGhhdmUgdmFyaWVkIGRlcGVuZGluZyBvbiByZWxpZ2lvc2l0eS9ldGMuIEZvciBub3csIEknbGwganVzdCBmb2N1cyBvbiBhIGNvdXBsZSBvZiB2YXJpYWJsZXMgdGhhdCBzZWVtIHRvIGhhdmUgYmVlbiBhbnN3ZXJlZCBpbiByZWFzb25hYmxlIHdheXMuCgojIyMgYHRoYjFfZGVtb19yZWx5YDog4oCcRnJvbSAxIHRvIDcsIGhvdyByZWxpZ2lvdXMgYXJlIHlvdT8gKDEgPSBub3QgcmVsaWdpb3VzIGF0IGFsbCwgNyA9IGV4dHJlbWVseSByZWxpZ2lvdXMp4oCdCgpgYGB7ciwgZWNobyA9IFR9CnIxLjYgPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICogY291bnRyeSAqIHRoYjFfZGVtb19yZWx5X251bQogICAgICAgICAgICAgKyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgIGRhdGEgPSBkMV9sb25nICU+JSAKICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgIT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgIG11dGF0ZSh0aGIxX2RlbW9fcmVseV9udW0gPSBzY2FsZSh0aGIxX2RlbW9fcmVseV9udW0pKSwKICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY291bnRyeSA9ICJjb250ci5zdW0iKSkKYGBgCgpgYGB7cn0KcmVndGFiX2Z1bihyMS42LCBzdGRfYmV0YSA9IFQsIAogICAgICAgICAgIGNvdW50cnlfdmFyMSA9ICJjb3VudHJ5MSIsIGNvdW50cnlfbmFtZTEgPSAiQ291bnRyeSAoVVMpIiwKICAgICAgICAgICBjb3VudHJ5X3ZhcjIgPSAiY291bnRyeTIiLCBjb3VudHJ5X25hbWUyID0gIkNvdW50cnkgKEdoYW5hKSIsCiAgICAgICAgICAgY291bnRyeV92YXIzID0gImNvdW50cnkzIiwgY291bnRyeV9uYW1lMyA9ICJDb3VudHJ5IChDaGluYSkiLAogICAgICAgICAgIHByZWRpY3Rvcl92YXIxID0gInRoYjFfZGVtb19yZWx5X251bSIsIAogICAgICAgICAgIHByZWRpY3Rvcl9uYW1lMSA9ICJIb3cgcmVsaWdpb3VzIGFyZSB5b3U/IikgJT4lIAogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBjKDEwLCAxNDoxNikpCmBgYAoKVGhpcyBhbmFseXNpcyBzdWdnZXN0cyB0aGF0IGdyZWF0ZXIgcmVsaWdpb3NpdHkgd2FzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbmNyZWFzZWQgZGlzdGluY3Rpb24gYmV0d2VlbiByZWxpZ2lvdXMgYW5kIGZhY3QgcXVlc3Rpb25zLiAoTm90ZSB0aGF0IHRoaXMgYW5hbHlzaXMgb21pdHMgcGFydGljaXBhbnRzIGZyb20gVGhhaWxhbmQsIHdobyBkaWQgbm90IGFuc3dlciB0aGlzIHF1ZXN0aW9uIGFib3V0IHJlbGlnaW9zaXR5LikKCmBgYHtyfQpkMV9sb25nICU+JSAKICBmaWx0ZXIoY291bnRyeSAhPSAiVGhhaWxhbmQiKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCB0aGIxX3N1YmosIHRoYjFfZGVtb19yZWx5X251bSwgc3VwZXJfY2F0KSAlPiUKICBzdW1tYXJpc2UoYmVsaWV2ZV9wcm9wID0gbWVhbihiZWxpZXZlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX3JlbHlfbnVtLCB5ID0gYmVsaWV2ZV9wcm9wLCBjb2xvciA9IHN1cGVyX2NhdCkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjAyKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAwOjYsIGxhYmVscyA9IGxldmVscyhkMSR0aGIxX2RlbW9fcmVseSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJIb3cgcmVsaWdpb3VzIGFyZSB5b3U/IiwgeSA9ICJQcm9wb3J0aW9uICdiZWxpZXZlJyByZXNwb25zZXMiLAogICAgICAgY29sb3IgPSAiQ2F0ZWdvcnkiKQpgYGAKCmBgYHtyfQpkMV9sb25nICU+JSAKICBmaWx0ZXIoY291bnRyeSAhPSAiVGhhaWxhbmQiKSAlPiUKICBncm91cF9ieShjb3VudHJ5LCB0aGIxX3N1YmosIHRoYjFfZGVtb19yZWx5X251bSwgc3VwZXJfY2F0KSAlPiUKICBzdW1tYXJpc2UoYmVsaWV2ZV9wcm9wID0gbWVhbihiZWxpZXZlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc3ByZWFkKHN1cGVyX2NhdCwgYmVsaWV2ZV9wcm9wKSAlPiUKICBtdXRhdGUoZGlmZiA9IHJlbGlnaW91cyAtIGZhY3QpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb19yZWx5X251bSwgeSA9IGRpZmYpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4wMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMDo2LCBsYWJlbHMgPSBsZXZlbHMoZDEkdGhiMV9kZW1vX3JlbHkpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBsYWJzKHggPSAiSG93IHJlbGlnaW91cyBhcmUgeW91PyIsIAogICAgICAgeSA9ICJEaWZmZXJlbmNlIGluIHByb3BvcnRpb24gJ2JlbGlldmUnIHJlc3BvbnNlc1xuKHJlbGlnaW91cyBxdWVzdGlvbnMgLSBmYWN0IHF1ZXN0aW9ucykiLAogICAgICAgY29sb3IgPSAiQ2F0ZWdvcnkiKQpgYGAKCiMjIyBgdGhiMV9kZW1vX2ltcHJgOiAiRnJvbSAxIHRvIDcsIGhvdyBpbXBvcnRhbnQgdG8geW91IGlzIHlvdXIgcmVsaWdpb3VzIHByYWN0aWNlPyAgKDEgPSBub3QgaW1wb3J0YW50IGF0IGFsbCwgNyA9IG9mIHV0bW9zdCBpbXBvcnRhbmNlKSIKCmBgYHtyLCBlY2hvID0gVH0KcjEuNyA8LSBsbWVyKGJlbGlldmUgfiBzdXBlcl9jYXQgKiBjb3VudHJ5ICogdGhiMV9kZW1vX2ltcHJfbnVtCiAgICAgICAgICAgICArICgxICsgc3VwZXJfY2F0IHwgdGhiMV9zdWJqKSArICgxIHwgcXVlc3Rpb24pLAogICAgICAgICAgICAgZGF0YSA9IGQxX2xvbmcgJT4lIAogICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSAhPSAiVGhhaWxhbmQiKSAlPiUKICAgICAgICAgICAgICAgbXV0YXRlKHRoYjFfZGVtb19pbXByX251bSA9IHNjYWxlKHRoYjFfZGVtb19pbXByX251bSkpLAogICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChjb3VudHJ5ID0gImNvbnRyLnN1bSIpKQpgYGAKCmBgYHtyfQpyZWd0YWJfZnVuKHIxLjcsIHN0ZF9iZXRhID0gVCwgCiAgICAgICAgICAgY291bnRyeV92YXIxID0gImNvdW50cnkxIiwgY291bnRyeV9uYW1lMSA9ICJDb3VudHJ5IChVUykiLAogICAgICAgICAgIGNvdW50cnlfdmFyMiA9ICJjb3VudHJ5MiIsIGNvdW50cnlfbmFtZTIgPSAiQ291bnRyeSAoR2hhbmEpIiwKICAgICAgICAgICBjb3VudHJ5X3ZhcjMgPSAiY291bnRyeTMiLCBjb3VudHJ5X25hbWUzID0gIkNvdW50cnkgKENoaW5hKSIsCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjEgPSAidGhiMV9kZW1vX2ltcHJfbnVtIiwgCiAgICAgICAgICAgcHJlZGljdG9yX25hbWUxID0gIkhvdyBpbXBvcnRhbnQgaXMgeW91ciByZWxpZ2lvdXMgcHJhY3RpY2U/IikgJT4lIAogIHJlZ3RhYl9zdHlsZV9mdW4ocm93X2VtcGggPSBjKDEwLCAxNDoxNikpCmBgYAoKVGhpcyBhbmFseXNpcyBzdWdnZXN0cyB0aGF0IG1vcmUgaW1wb3J0YW5jZSBwbGFjZWQgb24gcmVsaWdpb3VzIHByYWN0aWNlIHdhcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5jcmVhc2VkIGRpc3RpbmN0aW9uIGJldHdlZW4gcmVsaWdpb3VzIGFuZCBmYWN0IHF1ZXN0aW9ucy4gKE5vdGUgdGhhdCB0aGlzIGFuYWx5c2lzIG9taXRzIHBhcnRpY2lwYW50cyBmcm9tIFRoYWlsYW5kLCB3aG8gZGlkIG5vdCBhbnN3ZXIgdGhpcyBxdWVzdGlvbiBhYm91dCByZWxpZ2lvc2l0eS4pCgpgYGB7cn0KZDFfbG9uZyAlPiUgCiAgZmlsdGVyKGNvdW50cnkgIT0gIlRoYWlsYW5kIikgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgdGhiMV9zdWJqLCB0aGIxX2RlbW9faW1wcl9udW0sIHN1cGVyX2NhdCkgJT4lCiAgc3VtbWFyaXNlKGJlbGlldmVfcHJvcCA9IG1lYW4oYmVsaWV2ZSwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdncGxvdChhZXMoeCA9IHRoYjFfZGVtb19pbXByX251bSwgeSA9IGJlbGlldmVfcHJvcCwgY29sb3IgPSBzdXBlcl9jYXQpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yLCB3aWR0aCA9IDAuMSwgaGVpZ2h0ID0gMC4wMikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMDo2LCBsYWJlbHMgPSBsZXZlbHMoZDEkdGhiMV9kZW1vX2ltcHIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBsYWJzKHggPSAiSG93IGltcG9ydGFudCBpcyB5b3VyIHJlbGlnaW91cyBwcmFjdGljZT8iLCB5ID0gIlByb3BvcnRpb24gJ2JlbGlldmUnIHJlc3BvbnNlcyIsCiAgICAgICBjb2xvciA9ICJDYXRlZ29yeSIpCmBgYAoKYGBge3J9CmQxX2xvbmcgJT4lIAogIGZpbHRlcihjb3VudHJ5ICE9ICJUaGFpbGFuZCIpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIHRoYjFfc3ViaiwgdGhiMV9kZW1vX2ltcHJfbnVtLCBzdXBlcl9jYXQpICU+JQogIHN1bW1hcmlzZShiZWxpZXZlX3Byb3AgPSBtZWFuKGJlbGlldmUsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQoc3VwZXJfY2F0LCBiZWxpZXZlX3Byb3ApICU+JQogIG11dGF0ZShkaWZmID0gcmVsaWdpb3VzIC0gZmFjdCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGhiMV9kZW1vX2ltcHJfbnVtLCB5ID0gZGlmZikpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjIsIHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjAyKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAwOjYsIGxhYmVscyA9IGxldmVscyhkMSR0aGIxX2RlbW9faW1wcikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIGxhYnMoeCA9ICJIb3cgaW1wb3J0YW50IGlzIHlvdXIgcmVsaWdpb3VzIHByYWN0aWNlPyIsIAogICAgICAgeSA9ICJEaWZmZXJlbmNlIGluIHByb3BvcnRpb24gJ2JlbGlldmUnIHJlc3BvbnNlc1xuKHJlbGlnaW91cyBxdWVzdGlvbnMgLSBmYWN0IHF1ZXN0aW9ucykiLAogICAgICAgY29sb3IgPSAiQ2F0ZWdvcnkiKQpgYGAKCiMjIyBgdGhiMV9kZW1vd29yc2A6ICJIb3cgb2Z0ZW4gZG8geW91IGF0dGVuZCBwbGFjZXMgb2Ygd29yc2hpcD8iCgpgYGB7ciwgZWNobyA9IFR9CnIxLjggPC0gbG1lcihiZWxpZXZlIH4gc3VwZXJfY2F0ICogY291bnRyeSAqIHRoYjFfZGVtb193b3JzX251bQogICAgICAgICAgICAgKyAoMSArIHN1cGVyX2NhdCB8IHRoYjFfc3ViaikgKyAoMSB8IHF1ZXN0aW9uKSwKICAgICAgICAgICAgIGRhdGEgPSBkMV9sb25nICU+JSAKICAgICAgICAgICAgICAgbXV0YXRlKHRoYjFfZGVtb193b3JzX251bSA9IHNjYWxlKHRoYjFfZGVtb193b3JzX251bSkpKQpgYGAKCmBgYHtyfQpyZWd0YWJfZnVuKHIxLjgsIHN0ZF9iZXRhID0gVCwgCiAgICAgICAgICAgcHJlZGljdG9yX3ZhcjEgPSAidGhiMV9kZW1vX3dvcnNfbnVtIiwgCiAgICAgICAgICAgcHJlZGljdG9yX25hbWUxID0gIkhvdyBvZnRlbiBkbyB5b3UgYXR0ZW5kIHBsYWNlcyBvZiB3b3JzaGlwPyIpICU+JSAKICByZWd0YWJfc3R5bGVfZnVuKHJvd19lbXBoID0gYygxMiwgMTc6MjApKQpgYGAKClRoaXMgYW5hbHlzaXMgc3VnZ2VzdHMgdGhhdCBmcmVxdWVuY3kgb2YgYXR0ZW5kZW5jZSB3YXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluY3JlYXNlZCBkaXN0aW5jdGlvbiBiZXR3ZWVuIHJlbGlnaW91cyBhbmQgZmFjdCBxdWVzdGlvbnMuIAoKYGBge3J9CmQxX2xvbmcgJT4lIAogIGdyb3VwX2J5KGNvdW50cnksIHRoYjFfc3ViaiwgdGhiMV9kZW1vX3dvcnNfbnVtLCBzdXBlcl9jYXQpICU+JQogIHN1bW1hcmlzZShiZWxpZXZlX3Byb3AgPSBtZWFuKGJlbGlldmUsIG5hLnJtID0gVCkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aGIxX2RlbW9fd29yc19udW0sIHkgPSBiZWxpZXZlX3Byb3AsIGNvbG9yID0gc3VwZXJfY2F0KSkgKwogIGZhY2V0X2dyaWQoLiB+IGNvdW50cnkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMDIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDA6NCwgbGFiZWxzID0gbGV2ZWxzKGQxJHRoYjFfZGVtb193b3JzKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICJIb3cgb2Z0ZW4gZG8geW91IGF0dGVuZCBwbGFjZXMgb2Ygd29yc2hpcD8iLCAKICAgICAgIHkgPSAiUHJvcG9ydGlvbiAnYmVsaWV2ZScgcmVzcG9uc2VzIiwKICAgICAgIGNvbG9yID0gIkNhdGVnb3J5IikKYGBgCgpgYGB7cn0KZDFfbG9uZyAlPiUgCiAgZ3JvdXBfYnkoY291bnRyeSwgdGhiMV9zdWJqLCB0aGIxX2RlbW9fd29yc19udW0sIHN1cGVyX2NhdCkgJT4lCiAgc3VtbWFyaXNlKGJlbGlldmVfcHJvcCA9IG1lYW4oYmVsaWV2ZSwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChzdXBlcl9jYXQsIGJlbGlldmVfcHJvcCkgJT4lCiAgbXV0YXRlKGRpZmYgPSByZWxpZ2lvdXMgLSBmYWN0KSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aGIxX2RlbW9fd29yc19udW0sIHkgPSBkaWZmKSkgKwogIGZhY2V0X2dyaWQoLiB+IGNvdW50cnkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMDIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDA6NCwgbGFiZWxzID0gbGV2ZWxzKGQxJHRoYjFfZGVtb193b3JzKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICJIb3cgb2Z0ZW4gZG8geW91IGF0dGVuZCBwbGFjZXMgb2Ygd29yc2hpcD8iLCAKICAgICAgIHkgPSAiRGlmZmVyZW5jZSBpbiBwcm9wb3J0aW9uICdiZWxpZXZlJyByZXNwb25zZXNcbihyZWxpZ2lvdXMgcXVlc3Rpb25zIC0gZmFjdCBxdWVzdGlvbnMpIiwKICAgICAgIGNvbG9yID0gIkNhdGVnb3J5IikKYGBgCgoKCgo=